当你有子表和父表时,我知道如果我将使用级联选项 当我从父表中删除一些行时,它将删除相应的子行。
但是,当您从子表中删除第一行时,这也会有效吗? 是从父表中删除的相应行? 反正有可能吗?
编辑:我有一个游戏数据库,其中包括:
现在,当用户开始游戏时,他必须注册游戏(他可以只是他自己或者是玩游戏的团体的一部分)
现在我要做的是在某场比赛中只有一名球员: 当用户想要从数据库中删除此播放器时,它将从playersTbl,适当的游戏和游戏移动中删除记录。
编辑:现在,玩家TBl和gamesTbl是彼此的陌生人。 所以我看到的最佳解决方案是创建一个连接在这些表之间的新表。 现在我的数据库看起来像:
所以,如果我使用级联选项,则意味着:
但是每当用户删除某个播放器时,它只会从PlayersTbl和JoinTbl中删除..所以我的问题是这些表之间的最佳关系是什么,所以删除选项才能正常工作?
答案 0 :(得分:3)
不,当删除子项时,级联删除不会删除父级...也不应该删除。
例如,Customer
表(父表)和Order
表(子表)。仅仅因为删除了一个Order
行,这并不意味着也应该删除拥有Customer
的{{1}}行。 Order
可能有其他几十个Customer
...
如果你想要删除从父级到子级以及从子级到父级的级联,这似乎表明你的表之间存在一对一的关系......此时你应该问自己它们是否真的应该是两张桌子或合并成一张。
编辑:
@Elior在您的方案中,Orders
应该是Player
的父级,Game
应该是Game
的父级。如果您要删除GameMoves
,请删除该行,并启用级联删除,Player
与Game
相关联的行将被删除,然后会向下级联以删除Player
与被移除的GameMoves
相关联。
所有级联都是从父母到孩子......你不需要根据被移除的孩子删除任何父母。
答案 1 :(得分:1)
我认为最好的办法是在应用程序中处理此要求,而不是使用SQL触发器处理引用完整性。如果您的应用程序使用存储过程,那么将逻辑放在那里就可以了。参照完整性旨在防止孤儿记录,而不是确保所有父母拥有子记录。
技术上你可以创建一个触发器,如果删除了所有子项,则删除父项,但如果您希望父项没有子项,则触发器会阻止您这样做。
最好让该规则在堆栈中更高 - 无论是在应用程序中还是在存储过程中(如果您正在使用它们)。