您可以检查该行是否存在,然后插入或更新,但这保证您将执行两个 SQL 操作,而不是一个:
- 检查行是否存在
- 插入或更新行
更好的解决方案是始终先更新,如果没有更新任何行,则执行 INSERT,如下所示:
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
if @@ROWCOUNT = 0
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
这将需要一个 SQL 操作或两个 SQL 操作,具体取决于该行是否已存在。
但是,如果性能确实是一个问题,那么您需要确定这些操作是否更有可能是 INSERT 或 UPDATE。如果更新更常见,请执行上述操作。如果 INSERT 更常见,您可以反过来执行此操作,但您必须添加错误处理。
BEGIN TRY
insert into table1(id, name, itemname, itemcatName, itemQty)
values('val1', 'val2', 'val3', 'val4', 'val5')
END TRY
BEGIN CATCH
update table1
set name = 'val2', itemname = 'val3', itemcatName = 'val4', itemQty = 'val5'
where id = 'val1'
END CATCH
要真正确定是否需要执行 UPDATE 或 INSERT,您必须在单个 TRANSACTION 中执行两个操作。理论上,在第一个 UPDATE 或 INSERT(甚至是 EXISTS 检查)之后,但在下一个 INSERT/UPDATE 语句之前,数据库可能已经更改,导致第二个语句无论如何都会失败。这是极其罕见的,交易的开销可能不值得。
或者,您可以使用称为 MERGE 的单个 SQL 操作来执行 INSERT 或 UPDATE,但这对于这一单行操作来说也可能是多余的。
考虑阅读有关SQL 事务语句、竞争条件、SQL MERGE 语句的内容。