【问题标题】:ON DELETE SET NULL on self referencing relationshipON DELETE SET NULL 关于自引用关系
【发布时间】:2015-03-27 09:17:32
【问题描述】:

我有一张表,其中一张primary key 和一张foreign key 引用same table primary key。 即同一张桌子上有父母和孩子。在 sql server 中,删除规则有三个选项。但只能设置"NO ACTION"删除规则。我知道由于循环和链接,无法设置"cascade" delete。但是为什么不允许其他选项?尤其是"SET NULL" 之一。

现在我必须手动执行此操作。我必须找到子记录并将外键设置为空。之后我可以删除父级。为什么不能给它设置规则?

【问题讨论】:

  • 在你的情况下,我认为 trigger on delete 做你想做的事。看这个CREATE TRIGGER
  • 我想避免创建触发器,但这可能是一天结束时唯一的解决方案。我想知道是否有一些 DDL 解决方法来强制 sql server 允许“ONDELETE SET NULL”。如果不可能,那又是为什么呢?因为我看不到禁用“ONDELETE SET NULL”的原因与禁用“ONDELETE CASCADE”的原因相同。没有循环,也没有多个级联路径。我只是想确定在将其发布到 MS 愿望清单之前没有合乎逻辑的理由。
  • @matti 我找到了这个on delete set null

标签: sql sql-server foreign-keys self-referencing-table


【解决方案1】:

因为它不能同时在同一张表上执行两个动作,它们是:

-删除父级。

-更新孩子。

可变表是正在被 UPDATE、DELETE 或 INSERT 语句修改的表,或者可能会因 DELETE CASCADE 约束的影响而更新的表。

您可以通过创建一个过程来克服手动操作,该过程将持有父键以删除记录并将子键设置为 NULL。

procedure(parent_id) --takes the id as a parameter

   update table set null where foreign_key = parent_id;

   delete from table where id = parent_id;

end;

【讨论】:

  • 你能引用参考吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 1970-01-01
  • 2019-04-02
  • 2021-11-07
  • 2012-04-14
相关资源
最近更新 更多