何时/为什么在SQL Server中使用级联?

在SQL Server中设置外键时,在什么情况下应在删除或更新时级联它,其背后的原因是什么?

这可能也适用于其他数据库。

我正在寻找每种情况的具体示例,最好是从成功使用它们的人那里获得。


慕勒3428872
浏览 550回答 3
3回答

慕雪6442864

到目前为止我所看到的摘要:有些人根本不喜欢级联。级联删除当关系的语义可能涉及排他性的“是 ”描述的一部分时,级联删除可能很有意义。例如,OrderLine记录是其父订单的一部分,并且OrderLines永远不会在多个订单之间共享。如果Order消失,OrderLine也应该消失,没有Order的行将成为问题。级联删除的典型示例是SomeObject和SomeObjectItems,在这种情况下,没有相应的主记录就不会存在项目记录。你应该不使用级联删除,如果你保存历史或使用“软/逻辑删除”,您只设置一个删除位列1 /真。级联更新当您在表之间使用实键而不是代理键(标识/自动增量列)时,级联更新可能会很有意义。当您具有可变的外键(例如可以更改的用户名)时,Cascade Update的典型示例。你应该不使用级联更新与被标识/自动增量列键。级联更新最好与唯一约束结合使用。何时使用级联您可能希望在允许操作进行级联之前从用户那里获得额外的确认,但这取决于您的应用程序。如果您错误地设置了外键,级联会给您带来麻烦。但是,如果您做对的话,您应该可以。在完全理解之前,使用级联是不明智的。但是,它是一个有用的功能,因此值得花一些时间来理解。

慕田峪7331174

外键是确保数据库引用完整性的最佳方法。避免由于魔术而导致的级联就像在汇编中编写所有内容一样,因为您不相信编译器背后的魔术。不好的是错误使用了外键,例如,向后创建外键。胡安·曼努埃尔(Juan Manuel)的例子就是规范的例子,如果您使用代码,则有更多的机会在数据库中留下伪造的DocumentItem,这些东西会咬你。级联更新很有用,例如,当您通过可以更改的内容引用数据时,例如说用户表的主键是名称,姓氏组合。然后,您希望该组合中的更改传播到引用的任何位置。@Aidan,您所指的这种清晰度付出了高昂的代价,即有可能将虚假数据保留在数据库中,这是不小的机会。对我而言,通常只是缺乏对DB的熟悉,并且在与DB合作之前无法找到哪些FK会加剧这种恐惧。要么,要么是不断地滥用级联,在实体在概念上不相关的地方,或者必须保留历史的地方使用级联。

米脂

我从不使用级联删除。如果我想从数据库中删除某些内容,我想明确地告诉数据库我要取出的内容。当然,它们是数据库中可用的功能,有时可能可以使用它们,例如,如果您有一个“ order”表和一个“ orderItem”表,则您可能希望在删除某个表时清除它们。订购。我喜欢从代码(或存储过程)中获得的清晰度,而不是发生“魔术”事件。出于同样的原因,我也不喜欢触发器。需要注意的是,即使您删除了一个“订单”,即使级联删除删除了50个“ orderItem”,您也会得到“ 1行受影响”的报告。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

SQL Server