当前位置: 首页 > 面试题库 >

在SQL Server上执行INSERT或UPDATE的解决方案

壤驷承
2023-03-14
问题内容

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

我经常想更新现有记录,或者如果不存在则插入新记录。

本质上:

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

编写此代码的最佳方式是什么?


问题答案:

不要忘记交易。性能很好,但是简单的(IF EXISTS ..)方法非常危险。
当多个线程尝试执行插入或更新时,您很容易会遇到违反主键的情况。

@Beau Crawford和@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


 类似资料:
  • 问题内容: 在MySQL中,我试图找到一种有效的方法来执行更新(如果表中已经存在一行),或者执行INSERT(如果该行不存在)。 到目前为止,我发现了两种可能的方法: 一个明显的例子:打开一个事务,选择以查找该行是否存在,如果不存在则进行INSERT,如果存在则进行UPDATE,提交事务 首先将IGNORE插入表中(如果该行已存在,则不会引发错误),然后进行更新 第二种方法避免了交易。 您认为哪一

  • 问题内容: 我正在尝试用我所在国家的地理位置填充数据库。我的一张表有4个字段:ID [PK],纬度。经度和地理点 即时通讯收到以下错误:错误代码:1416无法从您发送到GEOMETRY字段的数据中获取几何对象 我很确定’geoPoint’字段是具有空间索引的POINT字段。我错过了什么吗?14 问题答案: 尝试执行此操作,而不将您的值分配给服务器值。尤其是当它们包含函数调用时。MySQL将变量的内

  • 问题内容: 现在已经在网上浏览了一段时间,似乎看不到任何与我想要的东西类似的东西。我知道这与我编写查询的方式有关,但是任何帮助将不胜感激。 我正在尝试做的基础知识是: 如果表中不存在,则将其插入表中 更新项目(如果存在) 它以以下格式存在: 名称,条形码,物品,数量,位置,价格和日期 名称-可以在多行条形码中使用-用于特定项目,但可以用作多个位置项目-与条形码相同,但包含名称数量-自我说明的位置-

  • 问题 问题是,在使用Maven构建项目的每一个版本中,该版本随机生成一个工作的jar或一个坏掉的jar。显然,在代码和配置方面都没有任何变化。 我说的破碎是什么意思? 破罐子。作业开始和结束都是正确的,没有例外,没有任何类型的回滚,并且CrudRepository的所有保存方法都执行得很好。问题是,即使我在日志中看到select语句来为INSERT提取序列的下一个值,也不会记录INSERT。检查数

  • 问题内容: 我不知道这是否真的正确。我有一个班级,如果这些字段当前存在,我想在其中更新数据库,如果不存在则要插入。复杂的是,我正在联接3个表(set_colors,school_art,baseimage) 任何帮助都将非常棒。 这是我所拥有的: 问题答案: 我相信您正在寻找以下语法

  • 问题内容: 我正在尝试创建一个小的测试应用程序,该应用程序读取FileStream的块并将其附加到SQL Server 2005 Express的VarBinary(max)列中。 一切正常,该列将按预期的方式填充,但我的机器似乎仍将所有内容缓冲到内存中,而我只是看不到为什么。 我正在使用以下代码(C#): 谁能告诉我为什么它将文件缓冲到内存中?我正在使用的缓冲区大小几乎只有2 MB。 我可以为每