使用C#的SQL表

时间:2013-03-18 18:36:02

标签: c# .net sql

当你有子表和父表时,我知道如果我将使用级联选项 当我从父表中删除一些行时,它将删除相应的子行。

但是,当您从子表中删除第一行时,这也会有效吗? 是从父表中删除的相应行? 反正有可能吗?

编辑:我有一个游戏数据库,其中包括:

  1. playersTbl(PK = PlayerID)
  2. GamesTbl(PK = GameID)
  3. GameMovesTbl(PK = MoveID,FK = GameID)
  4. 现在,当用户开始游戏时,他必须注册游戏(他可以只是他自己或者是玩游戏的团体的一部分)

    现在我要做的是在某场比赛中只有一名球员: 当用户想要从数据库中删除此播放器时,它将从playersTbl,适当的游戏和游戏移动中删除记录。

    编辑:现在,玩家TBl和gamesTbl是彼此的陌生人。 所以我看到的最佳解决方案是创建一个连接在这些表之间的新表。 现在我的数据库看起来像:

    1. PlayersTbl(PK = PlayerID)
    2. JoinTbl(FK = PlayerID,GameID)
    3. GamesTbl(PK = GameID)
    4. GameMovesTbl(PK = MoveID,FK = GameID)
    5. 所以,如果我使用级联选项,则意味着:

      1. PlayersTbl是JoinTbl的父表
      2. JoinTbl是GamesTbl的父表
      3. GamesTbl是GameMovesTbl的父表
      4. 但是每当用户删除某个播放器时,它只会从PlayersTbl和JoinTbl中删除..所以我的问题是这些表之间的最佳关系是什么,所以删除选项才能正常工作?

2 个答案:

答案 0 :(得分:3)

不,当删除子项时,级联删除不会删除父级...也不应该删除。

例如,Customer表(父表)和Order表(子表)。仅仅因为删除了一个Order行,这并不意味着也应该删除拥有Customer的{​​{1}}行。 Order可能有其他几十个Customer ...

如果你想要删除从父级到子级以及从子级到父级的级联,这似乎表明你的表之间存在一对一的关系......此时你应该问自己它们是否真的应该是两张桌子或合并成一张。

编辑:

@Elior在您的方案中,Orders应该是Player的父级,Game应该是Game的父级。如果您要删除GameMoves,请删除该行,并启用级联删除,PlayerGame相关联的行将被删除,然后会向下级联以删除Player与被移除的GameMoves相关联。

所有级联都是从父母到孩子......你不需要根据被移除的孩子删除任何父母。

答案 1 :(得分:1)

我认为最好的办法是在应用程序中处理此要求,而不是使用SQL触发器处理引用完整性。如果您的应用程序使用存储过程,那么将逻辑放在那里就可以了。参照完整性旨在防止孤儿记录,而不是确保所有父母拥有子记录。

技术上你可以创建一个触发器,如果​​删除了所有子项,则删除父项,但如果您希望父项没有子项,则触发器会阻止您这样做。

最好让该规则在堆栈中更高 - 无论是在应用程序中还是在存储过程中(如果您正在使用它们)。