【发布时间】:2016-07-07 16:54:35
【问题描述】:
不幸的是,我不知道如何命名这个问题,所以如果您有更好的建议,请继续编辑它:-)
多年来,我在尝试插入/更新一对一资源时一直在使用这种方法:执行 DELETE 以确保没有具有此类 PK 的行,然后仅执行 INSERT。我一直认为这是性能和简单性的最佳案例。在谈论性能时,我指的是双方的性能 - 数据库和应用程序层(即执行DELETE 查询似乎比执行SELECT 并检查结果更便宜,同时考虑到双向传输数据时) .
当然还有其他方法,例如INSERT ... ON DUPLICATE KEY UPDATE ...、IF EXISTS (SELECT ...) UPDATE ... ELSE INSERT... 或UPDATE ... ;IF ROWCOUNT = 0 INSERT ...(取决于底层的 RDBMS),当然也可以在应用层执行相同的操作,即首先检查条目是否存在以及是否存在它确实执行UPDATE, INSERT 否则(或执行UPDATE 并检查受影响的行数,如果为零,则执行INSERT [这带来另一个复杂性,因为如果UPDATE 不更改底层资源,它还返回零作为受影响的行数,因此跟随 INSERT 将返回 重复 PK 错误])...
我现在很好奇什么是最好的方法?最好的意思是,如果您考虑性能、最佳实践等...
【问题讨论】:
标签: database performance sql-update sql-insert one-to-one