2013-10-22 70 views
2

我在我的MySQL数据库中有两个表,EventTheme有一对一的关系。FK一对一的约束

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

你的桌子上有任何数据吗? – laviku

+0

是的,那里有数据。 – Adam

+0

要展开,theme_ids是有效的id引用和null的混合。 – Adam

回答

1

你有一个循环参考在这里 - Event有一个FK到ThemeTheme有一个FK到Event。从一张桌子到另一张桌子只能有一张FK,而不是两张。

我在这里猜测,因为我不确切知道你的数据是什么,但它看起来像一个“主题”是可以反复使用的东西,而事件是一次性的事情。所以我会有Event有一个FK到Theme,并删除Theme的FK到Event

+0

这是来自ORM的基础数据,我不想失去我的Theme对象的事件成员(这就是阻止我的一切)。 – Adam

+0

这看起来不正确...似乎每个事件都应该有一个主题,而不是相反。至于表格,如果这两个表格总是一对一的,你可以将它们合并成一张表格。或者你可以创建第三个表,将theme_id与event_id匹配(不太可取,因为这确实应该用于多对多)。我认为你需要重新评估你的整体数据设计。如果你做得对,你根本就不会有这个循环引用问题。 –

+0

谢谢。这使我指出了正确的方向,我错过了ORM中的一些配置选项,导致错误的约束。根据此配置更新:http://docs.doctrine-project.org/en/latest/reference/association-mapping.html#one-to-one-bidirectional – Adam

0

我想答案是从SQL标准Documentation

偏差:如果ON UPDATE CASCADE或ON UPDATE SET NULL递归到层叠期间更新其先前更新的同一个表,它就像RESTRICT。这意味着您不能使用自引用ON UPDATE CASCADE或ON UPDATE SET NULL操作。这是为了防止级联更新导致的无限循环。另一方面,可以使用自引用ON DELETE SET NULL,就像自引用ON DELETE CASCADE一样。级联操作的嵌套深度不得超过15层。