1

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

但是,当您首先从子表中删除某些行时,这也会起作用吗?是否将删除父表中的相应行?有可能吗?

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

  1. playerTbl (PK = PlayerID)
  2. GamesTbl (PK = GameID)
  3. GameMovesTbl (PK = MoveID,FK = GameID)

现在当用户开始游戏时,他必须注册到游戏中(他可以只是他自己或玩游戏的组的一部分)

现在我想做的是当某个游戏中只有一个玩家时:当用户想从数据库中删除这个玩家时,它会从玩家Tbl中删除记录,适当的游戏和游戏移动..

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

  1. PlayersTbl (PK = PlayerID)
  2. JoinTbl (FK = PlayerID, GameID)
  3. GamesTbl (PK = GameID)
  4. GameMovesTbl (PK = MoveID,FK = GameID)

因此,如果我使用 cascade 选项,则意味着:

  1. PlayersTbl 是 JoinTbl 的父表
  2. JoinTbl 是 GamesTbl 的父表
  3. GamesTbl 是 GameMovesTbl 的父表

但是,每当用户删除某个播放器时,它只会从 PlayersTbl 和 JoinTbl 中删除。所以我的问题是这些表之间的最佳关系是什么,以便删除选项可以正常工作?

4

2 回答 2

3

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

举个例子,一张Customer桌子(父)和一张Order桌子(子)。仅仅因为Order删除了一行,并不意味着Customer拥有 的行也Order应该被删除。Customer可能有几十个其他Orders...

如果您希望删除从父级到子级以及从子级到父级,这似乎表明您的表之间存在一对一的关系......此时您应该问自己它们是否真的应该是两个表或合二为一。

编辑:

@Elior在您的场景中,Player应该是的父级Game,并且Game应该是的父级GameMoves。如果要删除Player,删除行,并启用级联删除,Game与 关联的Player行将被删除,然后将向下级联以删除GameMoves与已删除的关联的行Game

所有的级联都是从父级到子级...您不需要根据被删除的子级来删除任何父级。

于 2013-03-18T18:39:13.507 回答
1

我认为你最好的选择是在应用程序中处理这个要求,而不是使用 SQL 触发器来处理引用完整性。如果您的应用程序使用存储过程,则可以将该逻辑放在那里。参照完整性旨在防止孤儿记录,而不是确保所有父母都有孩子记录。

从技术上讲,您可以创建一个触发器,如果​​所有子级都被删除,则删除父级,但如果您想要一个没有子级的父级,触发器将阻止您这样做。

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

于 2013-03-18T18:51:25.970 回答