为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕勒3428872 2019-12-10 10:46:25
在SQL Server中设置外键时,在什么情况下应在删除或更新时级联它,其背后的原因是什么?这可能也适用于其他数据库。我正在寻找每种情况的具体示例,最好是从成功使用它们的人那里获得。
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

到目前为止我所看到的摘要:

  • 有些人根本不喜欢级联。

级联删除

  • 当关系的语义可能涉及排他性的“是 ”描述的一部分时,级联删除可能很有意义。例如,OrderLine记录是其父订单的一部分,并且OrderLines永远不会在多个订单之间共享。如果Order消失,OrderLine也应该消失,没有Order的行将成为问题。

  • 级联删除的典型示例是SomeObject和SomeObjectItems,在这种情况下,没有相应的主记录就不会存在项目记录。

  • 你应该使用级联删除,如果你保存历史或使用“软/逻辑删除”,您只设置一个删除位列1 /真。

级联更新

  • 当您在表之间使用实键而不是代理键(标识/自动增量列)时,级联更新可能会很有意义。

  • 当您具有可变的外键(例如可以更改的用户名)时,Cascade Update的典型示例。

  • 你应该使用级联更新与被标识/自动增量列键。

  • 级联更新最好与唯一约束结合使用。

何时使用级联

  • 您可能希望在允许操作进行级联之前从用户那里获得额外的确认,但这取决于您的应用程序。

  • 如果您错误地设置了外键,级联会给您带来麻烦。但是,如果您做对的话,您应该可以。

  • 在完全理解之前,使用级联是不明智的。但是,它是一个有用的功能,因此值得花一些时间来理解。


查看完整回答
反对 回复 2019-12-10
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

外键是确保数据库引用完整性的最佳方法。避免由于魔术而导致的级联就像在汇编中编写所有内容一样,因为您不相信编译器背后的魔术。

不好的是错误使用了外键,例如,向后创建外键。

胡安·曼努埃尔(Juan Manuel)的例子就是规范的例子,如果您使用代码,则有更多的机会在数据库中留下伪造的DocumentItem,这些东西会咬你。

级联更新很有用,例如,当您通过可以更改的内容引用数据时,例如说用户表的主键是名称,姓氏组合。然后,您希望该组合中的更改传播到引用的任何位置。

@Aidan,您所指的这种清晰度付出了高昂的代价,即有可能将虚假数据保留在数据库中,这是不小的机会。对我而言,通常只是缺乏对DB的熟悉,并且在与DB合作之前无法找到哪些FK会加剧这种恐惧。要么,要么是不断地滥用级联,在实体在概念上不相关的地方,或者必须保留历史的地方使用级联。


查看完整回答
反对 回复 2019-12-10
?
米脂

TA贡献1836条经验 获得超3个赞

我从不使用级联删除。

如果我想从数据库中删除某些内容,我想明确地告诉数据库我要取出的内容。

当然,它们是数据库中可用的功能,有时可能可以使用它们,例如,如果您有一个“ order”表和一个“ orderItem”表,则您可能希望在删除某个表时清除它们。订购。

我喜欢从代码(或存储过程)中获得的清晰度,而不是发生“魔术”事件。

出于同样的原因,我也不喜欢触发器。

需要注意的是,即使您删除了一个“订单”,即使级联删除删除了50个“ orderItem”,您也会得到“ 1行受影响”的报告。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 546 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信