0

次のようなテーブル構造があります。

PrimaryTable->p_id ここで p_id はプライマリです

SecondoryTable->s_id p_id ここで p_id は外部キーです

ThirdTable->t_id s_id ここで s_id は外部キーです

FourthTable->f_id t_id ここで t_id は外部キーです

だから私は私のp_idからの1つを削除PrimaryTableしていて、そのSecondoryTableデータも削除し、データThirdTableを参照して削除しSecondoryTableFourthTableデータを参照して削除する必要がありますThirdTable

私はDeleteクエリを下から上に書くことができることを知っていますが、このような多くのレベルに対してどのように行うのですか??

私はこれを見つけましたが、ハウツーについてはわかりません: https://stackoverflow.com/a/9847308/1182021

その 4 つのレベルの階層のため、私は混乱しています。

EDIT1:

Primaryの削除時に削除したい場合はどうすればよいですかChild

よろしくお願いします。

4

3 に答える 3

1

OPのリクエストによると、これは、子テーブルから行が削除されたときに、ユーザーが親テーブルから行を削除したい場合の回答です。親が削除されたときにすべての子を再帰的に削除するケースは、MySQL ON DELETE CASCADE オプションを使用して機能しています。

4 つのテーブルは、table1、table2、table3、table4 です。

ユーザーが table2 の行と table1 (table2 の親) の対応する行を削除する場合、PHP では次のようにします。

// t2_delete_row_id is the id of the table 2 row to be deleted
// get the the parent of table2
$sql_get_parent = "select p_id from table2 where s_id = 't2_delete_row_id '";
// execute this query using MySQLi/PDO to get id of the parent row to be deleted
// assuming that id is t1_parent_row_id
// now delete the row from table 2:
// note that because of the foreign key constraints, 
// corresponding rows from table3 and table4 would also be deleted
$sql_delete_child = "delete from table2 where s_id = 't2_delete_row_id'";
if (mysqli_query($sql_delete_child)){
    // delete the parent row
    $sql_delete_parent = "delete from table1 where p_id = 't1_parent_row_id'";
}

このロジックを拡張して、table3 の行を削除すると、対応する親 (table2) と "grand-parent" (table1) の行も削除されるようになります。その場合、少し再帰が必要になる場合があります。これはもちろん、外部キー制約のため、table4 の子行を削除します。

于 2013-07-26T19:42:37.660 に答える
0

FOREIGN KEYS を使用できない場合 (つまり、MyISAM テーブルを使用している場合)、このために TRIGGER を作成します。以下の最初の例 ... カスケードしているテーブルごとに 1 つ作成する必要があります。

DELIMITER //
CREATE TRIGGER `pDeleteTrigger` BEFORE DELETE ON `PrimaryTable`
 FOR EACH ROW BEGIN
    DELETE FROM `SecondoryTable` WHERE NEW.`p_id` = `SecondoryTable`.`p_id`
END
//
DELIMITER ;
于 2013-07-26T18:43:25.673 に答える