3

我的 MySQL 数据库中有两个表EventTheme.

ALTER TABLE Event ADD CONSTRAINT FK_FA6F25A359027487 FOREIGN KEY (theme_id) REFERENCES Theme (_uuid) ON DELETE SET NULL;
ALTER TABLE Theme ADD CONSTRAINT FK_56B4C80C71F7E88B FOREIGN KEY (event_id) REFERENCES Event (_uuid) ON DELETE CASCADE;

我想要这样的行为,如果我删除主题记录,theme_id 设置为 NULL,如果我删除事件记录,主题记录也被删除。

但是,现在当我运行 DELETE FROM Event 时,我收到此错误。

SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`from_dev`.`eventleveltheme`, CONSTRAINT `FK_6E25E16871F7E88B` FOREIGN KEY (`event_id`) REFERENCES `Event` (`_uuid`))

我不能同时设置这两个约束吗?它们是否以某种方式发生冲突?

4

2 回答 2

1

你有一个循环引用在这里进行 -Event有一个 FK 到Theme并且Theme有一个 FK 到Event。从一张桌子到另一张桌子应该只有一个 FK,而不是两者。

我在这里猜测是因为我不知道您的数据的确切用途,但似乎“主题”是可以反复使用的东西,而事件是一次性的。所以我Event有一个 FK to Theme,并删除Theme's FK to Event

于 2013-10-22T14:38:03.610 回答
0

我认为答案在文档中

偏离 SQL 标准:如果 ON UPDATE CASCADE 或 ON UPDATE SET NULL 递归更新它先前在级联期间更新的同一个表,它的行为类似于 RESTRICT。这意味着您不能使用自引用 ON UPDATE CASCADE 或 ON UPDATE SET NULL 操作。这是为了防止级联更新导致的无限循环。另一方面,自引用 ON DELETE SET NULL 是可能的,自引用 ON DELETE CASCADE 也是如此。级联操作的嵌套深度不得超过 15 层。

于 2013-10-22T14:32:56.897 回答