4

我的问题是我可以使用复合主键的级联吗?我有一个表 FbUser 和一个表FbFriendsFbFriends表具有UIDFID作为复合主键,在其他表中它表示为foreign key(UID,FID) 如果我创建语句delete from FbFriends where UID="10" and FID="2"CASCADE,是否也会删除子行?

4

1 回答 1

8

ON DELETE CASCADE是外键的一个属性。这不是您添加到DELETE语句中的子句。如果定义外键是在删除父行时删除子行,那么不管外键是定义在单列还是多列上,删除都会级联。

不过,就我个人而言,我不喜欢级联删除或任何其他发生在代码逻辑之外的“魔法”。我见过太多ORM被错误配置为执行aDELETEINSERT不是a的情况UPDATE或者开发人员构建了一个脚本来删除和重新加载表中的一些行,当级联外键或未查看的触发器导致对一些其他表的修改时,无意中造成了混乱。如果最初的开发人员没有意识到这些表可能会受到他的更改的影响,那么他肯定无法测试这些表中的数据,并且在用户开始看到问题并哭泣之前,更改很容易被提升到生产环境中。当然,在父表之前从子表中显式删除更为冗长。但是这样做通常会使某人更有可能阅读并完整地遵循您的代码。

例如,在 Oracle 领域,Tom Kyte反对级联删除您还可以发现级联约束导致意外行为的各种情况,因为维护系统的开发人员不记得很久以前有人以特定方式配置了约束。就个人而言,我宁愿得到一个错误,告诉我数据库无法删除行,因为存在子行,而不是可能丢失我不打算丢失的数据。

于 2013-08-22T17:58:14.663 回答