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

标签 c# .net sql dataset foreign-keys

The MSDN claims that the order is :

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

我对此有疑问。

例子:ParentTable 有两条记录 parent1(Id : 1) 和 parent2(Id : 2)

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

如果我们更新 child1 以拥有一个新的父 parent2,然后我们删除 parent1。

  1. 我们在子表中没有要删除的内容
  2. 我们删除 parent1 :我们打破了约束,因为 child 仍然依附于 parent1,除非我们先更新它。

那么什么是正确的顺序,MSDN 在这个问题上是错误的吗?

我个人的想法是

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

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

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

最佳答案

您的 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/

相关文章:

MySQL单引号/双引号语法问题

C#:从 IEnumerable 获取随机值的优雅代码

c# - 尝试使用 WPF 创建一个 ListBox,我想通过代码填充成员

c# - 如何在 C# 控制台应用程序中返回一个简单的 int 值

c# - 多个串行端口读取仅在几分钟后挂起

c# - Scrollviewer 中的 UWP Canvas 像鼠标输入一样处理笔输入

c# - 哪个更快 List<string>.foreach 或 listString.GetEnumerator()

c# - 等待异步谓词列表,但在第一个 false 时退出

Mysql 结合两个查询

sql - 带分组+时间戳列的最新数据的物化 View