使用带有复合主键的级联

时间:2013-08-22 17:34:41

标签: mysql sql sql-server oracle

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

1 个答案:

答案 0 :(得分:8)

ON DELETE CASCADE是外键的属性。它不是您添加到DELETE语句中的子句。如果在删除父项时将外键定义为删除子行,则无论是在单个列还是在多个列上定义外键,删除都将级联。

但就个人而言,我并不是级联删除或任何其他“魔法”的忠实粉丝,这些“魔术”发生在一段代码中的逻辑之外。我已经看到太多的情况,其中ORM配置错误以执行DELETE后跟INSERT而不是UPDATE或开发人员构建删除和重新加载某些数字的脚本如果级联的外键或未查看的触发器导致对某些其他表的修改,则表中的行无意中会造成混乱。如果原始开发人员没有意识到这些表可能会受到他的更改的影响,他肯定无法测试这些表中的数据,并且在用户开始看到问题和哭泣之前,更改可以很容易地升级到生产。当然,在父表之前显式删除子表更加冗长。但这样做通常会使某人更有可能完整地阅读和遵循您的代码。

例如,在Oracle领域,Tom Kyte是against cascade deletes。您还可以找到cascading constraints caused unexpected behavior的各种情况,因为维护系统的开发人员不记得很久以前有人以特定方式配置了约束。就个人而言,我更愿意得到一个错误,告诉我数据库不能删除一行,因为有子行而不是可能丢失我不打算丢失的数据。