删除/更新外键约束中SET NULL的目的是什么?


15

我可能心胸狭窄,但是如果创建外键约束并且行被更新或删除,那么如果子表的列设置为NULL,则我将失去该连接。

有意保留这些孤立行的目的是什么?


我正在寻找用例,但我不认为它们是特定于数据库的(这里可能是错误的)
Derek Downey

我也从未见过用例……
a_horse_with_no_name11年

Answers:


13

是否set null有用取决于您null在特定情况下选择的意思-围绕nullIMO的所有困惑和观点,明智的方法是使DBA能够

  1. 选择(和记录)对于每个可为空字段意味着什么
  2. 确保它只意味着件事

使用这些规则,请考虑以下用例:

  • 您有一张桌子“商店”(例如各个场所)
  • 您有一个表格“零售商”(例如连锁店)
  • “商店”表具有一个查找字段,该字段引用“零售商”的关键字
  • 您已定义null代表一家独立商店(即不属于连锁店的商店)
  • “零售商”关闭分支机构,以至于您认为其商店是独立的

在这种情况下,是on delete set null有道理的。还有其他方法可以对这些业务规则进行建模,但这是最简单的,如果它能准确地满足您在现实世界中关心的事实,那么我认为这完全可以


严格意义上为null的好点,并且通过您的示例可以清楚知道为什么这是功能。
德里克·唐尼

1

我通常可以想到的大多数用例的形式是“嗯,我们可以做一些不同的事情,但是我们感觉却是这样做了”。

考虑owner一个公司的问题跟踪系统中的错误字段。如果约翰辞职,那么在删除帐户时,肯定不能简单地删除他的所有问题。即使这样,某些数据库仍允许SET DEFAULT作为操作(或让触发器执行相同的任务),并且可以选择让Nobody员工成为问题的默认所有者。或者,我们可以disabled为John 提供一个字段,而不是删除他的记录。


3
在这种情况下RESTRICT,如果没有其他原因在出现问题时将责任归咎于老员工,那么我将不允许使用delete()!
德里克·唐尼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.