假设表 struct 为MyTable(KEY, datafield1, datafield2...).

我经常想更新现有记录,或者在不存在的情况下插入新记录.

基本上:

IF (key exists)
  run update command
ELSE
  run insert command

写这篇文章最好的方式是什么?

推荐答案

不要忘记交易.性能很好,但很简单(如果存在的话)这种做法非常危险

@Beau Crawf或d&@Esteban展示了总体思路,但容易出错.

为了避免死锁和PK冲突,您可以使用以下方法:

begin tran
if exists (select * from table with (updlock,serializable) where key = @key)
begin
   update table set ...
   where key = @key
end
else
begin
   insert into table (key, ...)
   values (@key, ...)
end
commit tran

begin tran
   update table with (serializable) set ...
   where key = @key

   if @@rowcount = 0
   begin
      insert into table (key, ...) values (@key,..)
   end
commit tran

Sql相关问答推荐

如何简化此表达以使搜索查询忽略标点符号?Microsoft Access 2007-2016

创建每小时重置的序列号

在SQL中向每个子字节组添加字节行

如何实现一个广泛的多级自连接PostgreSQL查询?

SQL查询组类值在同一行中,并连接和排序其他值

如何连接第二个表并将其内容输入到第一个表的单个字段中?

在postgres中动态计算出现次数并插入到json中

SQL将 Select 查询作为新列添加到另一个 Select 查询

基于多列比较连接两个表

以一致的价值获得独特的价值

属于(日期)范围类型及其交集的总权重​

在VB.NET中如何在MS Access数据库中创建SQL项目历史库存卡

不存在记录的国外关键点

在SQL中转换差异表的多列

聚合内部的条件在哪里?

Postgresql:在链接表中判断相关表中插入值的条件

如何根据与 BigQuery 中另一个表的匹配更新一个表中的列?

使用标准SQL 触发更新当前日期

来自 SQL Server 的树层次 struct 图的 JSON

使用 JSON_BUILD_OBJ 从 Postgres 返回 JSON