The MSDN claims that the order is :
- 子表:删除记录。
- 父表:插入、更新和删除记录。
- 子表:插入和更新记录。
我对此有疑问。
例子:ParentTable 有两条记录 parent1(Id : 1) 和 parent2(Id : 2)
ChildTable有一条记录child1(Id : 1, ParentId : 1)
如果我们更新 child1 以拥有一个新的父 parent2,然后我们删除 parent1。
- 我们在子表中没有要删除的内容
- 我们删除 parent1 :我们打破了约束,因为 child 仍然依附于 parent1,除非我们先更新它。
那么什么是正确的顺序,MSDN 在这个问题上是错误的吗?
我个人的想法是
- 子表:删除记录。
- 父表:插入、更新记录。
- 子表:插入和更新记录。
- 父表:删除记录。
但问题是,由于存在潜在的唯一约束,我们必须始终在添加新记录之前删除表中的记录...所以我现在没有将数据提交到数据库的解决方案。
编辑:感谢您的回答,但您的极端案例是我的日常案例...我选择了禁用约束的丑陋解决方案,然后更新数据库并重新启用约束。我仍在寻找更好的解决方案..
最佳答案
您的 SQL 产品不支持延迟约束检查吗?
如果没有,你可以试试
删除所有子记录-删除所有父记录-插入所有父记录-插入所有子记录
其中任何 UPDATE 已被拆分为其构成的 DELETE 和 INSERT。
这应该在所有情况下都能正常工作,但可能在任何情况下都以可接受的速度......
还可以证明,这是唯一可以在所有情况下正常工作的方案,因为:
(a) 对父项的关键约束规定父项 DELETES 必须先于父项 INSERTS,
(b) 对子项的关键约束规定子项 DELETES 必须先于子项 INSERTS,
(c) FK 规定子 DELETES 必须先于父 DELETES
(d) FK 还规定子 INSERTS 必须跟在父 INSERTS 之后
给定的序列是满足这 4 个要求的唯一可能的序列,它还表明无论如何更新对 child 的解决方案都是不可能的,因为更新意味着“同时”删除和插入。
关于c# - 数据集的插入/删除/修改的正确顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9801930/