我的问题是,我可以使用级联与复合主键吗?我有一张桌子FbUser和一个桌子FbFriends。FbFriends表以UID和FID作为复合主键,在其他表中它表示为foreign key(UID,FID),如果我声明delete from FbFriends where UID="10" and FID="2"级联,那么也会删除子行吗?
发布于 2013-08-22 17:58:14
ON DELETE CASCADE是外键的属性。它不是添加到DELETE语句中的子句。如果在父项被删除时,外键被定义为删除子行,那么无论外键是在单个列上定义还是在多个列上定义,删除都会级联。
不过,就我个人而言,我不太喜欢级联删除,也不喜欢在一段代码中发生在逻辑之外的任何其他“魔法”。我看到过太多这样的情况: ORM被错误地配置为执行DELETE,然后是INSERT而不是UPDATE,或者开发人员构建了一个脚本,该脚本删除和重新加载表中的一些行时,无意中造成了混乱,因为级联外键或触发器导致对一些其他表的修改。如果最初的开发人员没有意识到这些表可能受到他的更改的影响,那么他肯定无法测试这些表中的数据,而且在用户开始发现问题并大哭之前,更改很容易升级到生产中。当然,在父表之前显式地从子表中删除更详细。但是,这样做通常会使人更有可能阅读并完全遵循您的代码。
例如,在Oracle领域,Tom是against cascade deletes。您还可以找到cascading constraints caused unexpected behavior的各种情况,因为维护系统的开发人员不记得很久以前有人以特定的方式配置了这些约束。就我个人而言,我更希望得到一个错误,告诉我数据库不能删除一行,因为有子行,而不是可能丢失我不打算丢失的数据。
https://stackoverflow.com/questions/18387173
复制相似问题