【问题标题】:Update one to many relationship data in database更新数据库中的一对多关系数据
【发布时间】:2011-03-28 23:21:44
【问题描述】:

我想更新数据库中具有一对多关系的列表。

例如,有 100 多个科目,学生可以选择他想要的任何内容。假设下次学生编辑他的选择。

对于这种情况,您更新数据库的方式是什么?我习惯做的是删除所有过去的选择并添加所有新选择的主题。这是非常简单的逻辑,但我只是想知道在性能方面是否有更好的方法来做到这一点。在我的例子中,'delete' 是一个单一的数据库调用,而插入 all 是一个单一数据库连接中的循环。

我知道我们可以添加一个逻辑来识别已删除的记录和新添加的记录。这样做真的值得吗?遇到类似情况你会怎么做?

谢谢!

【问题讨论】:

  • @one 可能存在真正的重复,但您的链接问题完全不同。你说删除插入(作为答案)。这里的问题本身是,有什么比删除插入更好的吗?另一个问题涉及2个关系。这个问题涉及一个多属性关系,表示为 1:N 对单亲。
  • @Richard aka cyberkiwi:你读过“长尾编程问题的维基百科”吗? (blog.stackoverflow.com/2011/01/…) 我不认为发布重复的答案符合 SO 的精神。
  • @one 在您的链接中,您是否看到如果您要将用户的问题作为重复项关闭,它必须是真正的重复项。?先给我找一个完全一样的副本
  • @Richard aka cyberkiwi:“先给我找一个完全相同的副本”——我怀疑我做不到,这是主观的。这就是为什么我们有赞成票和反对票的原因,不是吗?

标签: c# sql sql-server database relational-database


【解决方案1】:

为了简洁起见,delete-reinsert 方法并没有什么问题,禁止子表中的外键挂钩或为每个(重新)插入触发触发。

另一种方法是将新集合作为表值参数传递给 SP 到 Sql Server,然后使用两个查询进行更改

delete many_table
where studentid=@studentid and someid not in (select someid from @tableparam p)

insert many_table(studentid, someid)
select @studentid, p.someid
from @tableparam p left join many_table t on p.someid=t.someid and t.studentid=@studentid
where t.someid is null

(SQL Server 2008 有更优雅的 MERGE 语法,这是另一种选择,进一步测试您的 TSQL 技能)

【讨论】:

  • 六个半打其他...您的选择
  • 只要你的删除/插入是原子的就可以了。如果您没有在承诺控制下执行此操作,并且有人在您的更新过程中读取了表格,您可能会遇到麻烦。
  • @one 找不到完全相同的副本这一事实说明了一切
  • @one 仅仅因为您不同意人/元方法(与答案无关)而不是答案而投反对票并不好
  • 赞成中和反对票。无论之前是否有人问过,这都是一个有用的答案。
猜你喜欢
  • 1970-01-01
  • 2018-09-26
  • 2017-05-30
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 2020-05-15
  • 2023-01-03
  • 1970-01-01
相关资源
最近更新 更多