我想更新数据库中具有一对多关系的列表。
例如,有超过100个科目,学生可以选择他想要的任何东西。让我们说下一次学生编辑他的选择。
为此案例更新数据库的方式是什么?我以前做的是删除所有过去的选择并添加所有新选择的主题。这是非常简单的逻辑,但我只是想知道在性能方面是否有更好的方法来做到这一点。在我的例子中,'delete'是单个数据库调用,并且插入all是单个数据库连接中的循环。
我知道我们可以添加一个逻辑来识别已删除的记录和新添加的记录。这真的值得吗?你会为类似案件做些什么?
谢谢!
答案 0 :(得分:4)
为了简洁和简洁,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技能)