数据集上插入/删除/修改的正确顺序是什么?

Cyr*_*don 16 .net c# sql foreign-keys dataset

MSDN声称订单是:

  1. 子表:删除记录.
  2. 父表:插入,更新和删除记录.
  3. 子表:插入和更新记录.

我有一个问题.

示例:ParentTable有两个记录parent1(Id:1)和parent2(Id:2)

ChildTable有一个记录child1(Id:1,ParentId:1)

如果我们更新child1以获得新的父parent2,然后我们删除parent1.

  1. 我们在子表中没有删除任何内容
  2. 我们删除了parent1:我们打破了约束,因为子节点仍然附加到parent1,除非我们先更新它.

那么正确的顺序是什么,并且主题上的MSDN是假的?

我个人的想法是

  1. 子表:删除记录.
  2. 父表:插入,更新记录.
  3. 子表:插入和更新记录.
  4. 父表:删除记录.

但问题是,由于潜在的唯一约束,我们必须在添加新的之前删除表中的记录...所以我现在没有解决方案将数据提交到我的数据库.

编辑:感谢您的答案,但您的角落案例是我的日常案例......我选择了丑陋的解决方案来禁用约束,然后更新数据库,并重新启用约束.我还在寻找更好的解决方案..

Erw*_*out 4

您的 SQL 产品不支持延迟约束检查吗?

如果没有,你可以尝试

删除所有子记录 - 删除所有父记录 - 插入所有父记录 - 插入所有子记录

其中任何 UPDATE 都已分为其组成部分 DELETE 和 INSERT。

这应该在所有情况下都能正常工作,但在可接受的速度下可能没有......

还可以证明这是唯一可以在所有情况下正确工作的方案,因为:

(a) 对父项的关键约束规定父项 DELETES 必须在父项 INSERTS 之前,
(b) 对子项的关键约束规定子项 DELETES 必须在子项 INSERTS 之前,
(c) FK 规定子项 DELETES 必须在父项 DELETES 之前
(d) FK 还规定子插入必须遵循父插入

给定的序列是满足这 4 个要求的唯一可能的序列,并且它还表明,无论如何,对子级的 UPDATE 都会使解决方案变得不可能,因为 UPDATE 意味着“同时”DELETE 加 INSERT。