FK约束一对一

时间:2013-10-22 14:24:26

标签: mysql sql doctrine constraints

我的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`))

我可以不设置这两个约束吗?他们有点冲突吗?

2 个答案:

答案 0 :(得分:1)

这里有一个循环引用 - Event有一个FK到ThemeTheme有一个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级。