我的MySQL数据库中有一对一关系,有两个表Event
和Theme
。
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`))
我可以不设置这两个约束吗?他们有点冲突吗?
答案 0 :(得分:1)
这里有一个循环引用 - Event
有一个FK到Theme
而Theme
有一个FK到Event
。从一个表到另一个表应该只有一个FK,而不是两个。
我猜这里是因为我不确切知道你的数据是什么,但似乎“主题”是可以反复使用的东西,而事件是一次性的事情。所以我Event
有一个FK到Theme
,并将Theme
的FK删除到Event
。
答案 1 :(得分:0)
我认为答案在Documentation
与SQL标准的偏差:如果ON UPDATE CASCADE或ON UPDATE SET NULL recurses更新它在级联期间先前更新的同一个表,它就像RESTRICT一样。这意味着您不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作。这是为了防止级联更新导致的无限循环。另一方面,自引用ON DELETE SET NULL是可能的,就像自引用ON DELETE CASCADE一样。级联操作可能不会嵌套超过15级。