为这个例子道歉,这是我能想到的最好的。
情景
我正在构建一个Laravel 4.1应用程序,我在一个名为people
的数据库中有两个表houses
和hogwarts
。
people
包括学生,工作人员,鬼魂,吉祥物等等,因此有house_id
的外键将每个人与房子联系起来。每个房子都有一个房子的头部,所以有head_id
将房子连接回一个人。
这会创建一个外键循环,阻止每个表被播种,直到另一个表被播种,所以我选择做的是允许head_id
表上的houses
可以为空。 / p>
这意味着我可以先在房屋的桌子上播种,不设置房屋的头部,然后与每个与房屋相关的人种下人员桌。
问题
问题是我现在需要指定另一个种子来改变houses
表,以便为每个房子设置head_id
,但我找不到告诉你如何更新现有数据的地方在种子内。
答案 0 :(得分:0)
您描述的数据库结构会创建一个循环依赖项,导致您描述的问题,循环依赖本身没有任何根本错误,但在与DBMS外部的数据交互时可能会导致约束违规。
因此,我建议在数据库中添加第三个表来抽象人与房屋之间的关系,其中可能包含一个布尔字段,表明某人是否是房屋负责人。
然后,您可以向新表添加唯一约束:
一个穿过house_id和一个新的布尔字段以确保每个房子只有一个头
更新:上述约束不起作用,因为(house_id,true)将是唯一的一次,但是你将与许多(house_id,false)值重复。
如果你将head_id留在house表中,那么你可以先在people表中播种,当你为house表播种时,你可以添加head person的id,而不会违反关系,因为它不再是循环的。
然后,您可以播种第三个表格,将人们联系到解决循环依赖问题的房屋。
您可以在新表中的person_id上添加唯一约束,以确保某人只能是一个人的成员,或者您可以在业务逻辑中处理这些规则。