5

MySQL に問題があります - 複数のテーブルに対する CASCADE ON DELETE ルールです。明らかに、「CASCADE ON DELETE」ルールの実行順序は、定義の順序に依存します。

しかし、この実行順序は明確に定義されていますか、それとも MySQL バージョンに依存していますか?

これは、3 つのテーブル「A」、「B」、「C」の簡単な例です。

create table `A` (`id` NUMERIC(10,0) NOT NULL)  ENGINE=INNODB;
create table `B` (`id` NUMERIC(10,0) NOT NULL, `a_id`  NUMERIC(10,0) NOT NULL) ENGINE=INNODB;
create table `C` (`id` NUMERIC(10,0) NOT NULL, `a_id`  NUMERIC(10,0) NOT NULL, `b_id` NUMERIC(10,0) NOT NULL) ENGINE=INNODB;

ALTER TABLE `A` ADD PRIMARY KEY (`id`);
ALTER TABLE `B` ADD PRIMARY KEY (`id`);
ALTER TABLE `C` ADD PRIMARY KEY (`id`);


ALTER TABLE `C` ADD CONSTRAINT `C1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
ALTER TABLE `B` ADD CONSTRAINT `B1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
ALTER TABLE `C` ADD CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`);

次のデータを挿入すると:

INSERT INTO A (id) VALUES (1);
INSERT INTO B (id, a_id) VALUES (1,1);
INSERT INTO C (id, a_id, b_id) VALUES (1,1,1);

...そして、テーブル「A」の唯一のエントリを削除しようとします:

delete from A where id=1;

...次のエラー メッセージが表示されます。

Cannot delete or update a parent row: a foreign key constraint fails (`C`, CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`))

しかし、外部キー制約の定義を次のように変更すると:

ALTER TABLE `C` ADD CONSTRAINT `C1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;
ALTER TABLE `C` ADD CONSTRAINT `C2` FOREIGN KEY (`b_id`) REFERENCES `B` (`id`);
ALTER TABLE `B` ADD CONSTRAINT `B1` FOREIGN KEY (`a_id`) REFERENCES `A` (`id`) ON DELETE CASCADE;

...すべて順調...

ご協力いただきありがとうございます

4

1 に答える 1

-1

あなたALTER TABLE table ADD CONSTRAINT foreign_key FOREIGN KEYは同じなので、エラーの理由にはなりません。

(...テキストは削除されます)


その奇妙な振る舞いを説明することはできません。回避策を提案できます:

SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM A WHERE ID=1;
SET FOREIGN_KEY_CHECKS = 1;
于 2012-12-19T13:05:58.580 に答える