数据库Upserts - 好或坏的做法?

gb2*_*b2d 11 mysql sql-server oracle database-design

寻找关于Upsert(插入或是否存在,然后更新)过程在数据库编程中是否被视为不良实践的一些见解.如果有任何相关性,我在SQL服务器上工作.

在几个月前我工作过的地方,常驻数据库大师在新编写的数据库编码标准(我同意其中大部分)中都说过,应该避免使用Upserts.

我无法真正看到这个的逻辑原因,并认为我自己合理地意识到良好的编程实践.我认为它们对于直接数据管理很有用,并有助于避免过多的存储过程编号.

寻找一些有助于我得出结论的见解/讨论.

谢谢.

更新回复评论:

我所指的具体上下文是在数据库中创建或更新域实体数据表示.比如说,"Person"对象作为数据库中"Person"表的表示存在.我只需要一种机制来创建一个新的Person,或者更新一个现有的Person.在这里,我可以选择创建Upsert存储过程,或者两个单独的存储过程 - 一个用于Update,一个用于Insert.

任何人看来有什么优点或缺点?

JOT*_*OTN 12

当意图添加新记录时,主要问题是覆盖现有记录,因为选择的任何密钥都是重复的.比如说一个登录名.您看到登录存在,因此您应该在应该回复登录重复的错误时进行更新.

第二个问题是恢复已删除的记录.假设进程"A"查询记录,进程"B"删除它,然后进程"A"提交更改.打算删除的记录现在返回到数据库中,而不是将异常传回"A",表示已将其删除.


Ron*_*nis 9

我喜欢有目的地编程.

要么我正在创建一些东西,在这种情况下我会希望插入失败(重复),如果那里已经有一个实体.或者,我正在更新我知道的东西,在这种情况下,我希望更新失败(实际上不会发生).

使用upsert/merge,这会变得模糊.我还是没有成功?我部分成功了吗?行中的一些值是我的(来自插入),其中一些是以前的?

话虽如此,Upserts很有用(这就是为什么它们一开始就被实现),禁止它们只会很愚蠢.这就像禁止道路,因为犯罪分子利用它们远离警察.有无数种情况,其中up​​serts是唯一合理的做事方式.任何在系统之间同步数据的人都知道这一点.