Sql Server 2005 - 如果不存在则插入

Pau*_*aul 7 sql-server transactions insert exists

互联网上有很多关于这个常见"问题"的信息.

解决方案如:

IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)

在我看来并不是线程安全的,你可能会同意.

但是你能否确认将exists存入一个select的where子句会解决sql引擎中最高并发性的问题?够了吗?

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)

应该在那里还添加了一些更高的事务级别,还是可以在默认的一个上执行:commit?

这会在未提交的水平下工作吗?

谢谢!

//稍后添加

我可以假设两个sql'都是正确的:

1)设置事务隔离级别可重复读取

   IF NOT EXISTS() BEGIN INSERT INTO (...) END
Run Code Online (Sandbox Code Playgroud)

2)设置事务隔离级别可重复读取

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 6

使用TRY/CATCH可以避免额外的读取

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH
Run Code Online (Sandbox Code Playgroud)
  • NOT EXISTS将读取表格,无论是在IF还是WHERE
  • INSERT需要读取以检查唯一性

如果您可以丢弃重复项,这是一种高度可扩展的技术

链接: