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

2023-11-24

互联网上有很多关于这个常见“问题”的信息。

解决方案如:

IF NOT EXISTS() BEGIN INSERT INTO (...) END

在我看来,它们不是线程安全的,您可能会同意。

但是你能确认将exists放入单选的where子句中就可以解决sql引擎的最高并发问题吗? 够了吗?

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)

应该还有添加一些更高的交易级别或者 这可以在默认的情况下执行吗:已提交?

这可以在未承诺的水平下工作吗?

Thanks!

//稍后添加

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

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

   IF NOT EXISTS() BEGIN INSERT INTO (...) END

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

insert into Table (columns)
select column1, column2, column3
where not exists (select top 1 1 from Table where something)

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

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH
  • A NOT EXISTS 会读取表,无论是在 IF 还是 WHERE
  • INSERT 需要读取来检查唯一性

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

Links:

  • 在这里查看我的答案:仅在行尚不存在时插入行 and SQL Server 2008:如果不存在则插入,维护唯一列
  • 如果您也需要更新:delete-insert 与 if-update else-insert 哪个是最佳选择?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sql Server 2005 - 如果不存在则插入 的相关文章

随机推荐

  • ExecutorService 的 shutdown() 不会等到所有线程都完成

    我有一个代码 其中 4 个线程同时运行 我想等到这 4 个线程全部完成 只有在那之后才能继续应用程序流程 我尝试了两种方法 Thread join 此方法按预期工作 后面的代码join 仅在所有线程完成后才执行 ExecutorServic
  • Laravel htaccess 问题

    我正在尝试建立一个网站 该网站在实时开发服务器上运行得非常好 我们一直用该服务器向客户端展示该网站 这是来自实时开发的 htaccess 工作正常
  • 覆盖 Android 上的物理菜单按钮

    我希望 Android 设备上的菜单键打开一个对话框 而不是在我的应用程序运行时打开菜单 我尝试将其编码为onCreateOptionsMenu Menu menu 但它只在我第一次按下菜单按钮时起作用 我可以用其他方式来做吗 您可以通过在
  • 如何使用 Ncurses 打印 (☞゚ヮ゚)☞?

    我想在 Ubuntu 中使用 C 使用 Ncurses 库打印 首先 您只需拥有以下内容即可做到这一点 std cout lt lt lt lt std endl 而且效果很好 但是 当使用 Ncurses 打印时 我认为您需要使用prin
  • 停止 Jetpack Compose pointInteropFilter 消耗输入事件

    我有一个垂直的Column有两个孩子 A Pager可组合 来自伴奏者 显示Text A Canvas绘制两个圆弧和一个圆的可组合项 它们的排序顺序与此处描述的顺序相同 我想要Text始终渲染在Canvas 实施细节 The Canvas可
  • 不同CG/GLSL/HLSL功能的性能

    有着色器函数的标准库 例如 forCg 但是是否有资源可以告诉您每个操作需要多长时间 我的想法类似于您过去如何查找每个 ASM 操作需要多少个周期 没有reliable资源将告诉您各种标准着色器函数需要多长时间 即使对于特定的硬件也是如此
  • 捆绑包无效 - Info.plist 中的 CFBundleVersion 和 CFBundleShortVersionString 必须包含更高版本 - 但它们确实包含

    在尝试验证我的应用程序以准备提交到应用程序商店时 我收到以下错误 但这是我的 Info plist 的屏幕截图 错误消息声称列表版本为 1 0 但显示版本为 1 4 我做错了什么 我该如何解决这个问题 Apple 考虑每个版本级别 sepa
  • 加载数据时浏览器忙指示器

    我正在努力实现已经解释过的目标here 我正在尝试使用动态脚本标签将一些数据从服务器加载到客户端 即我创建一个脚本标签 将其 src 设置为我的 JSON 控制器并将其附加到我的 head 或 body 标签 脚本正确加载从服务器返回的数据
  • 如何检查安装的 OpenSSL 版本是否 >= 0.9.8k

    我有一个 PHP 5 x 脚本 需要 OpenSSL 0 9 8k 或更高版本 关于OpenSSL 我发现了以下两个相关常量 OPENSSL VERSION TEXT with value OpenSSL 1 0 0c 2 Dec 2010
  • 以编程方式启用高精度或省电定位模式,无需用户访问“设置”

    为什么我问这个 也是在应用程序中尝试它的原因 它发生了当我们使用谷歌地图棒棒糖 即使位置被禁用 用户从地图应用程序输入后 它也会以高精度模式打开 而无需访问 设置 启用蓝牙可以实现类似的功能 该操作是在我的应用程序中启动的 用户需要做出选择
  • HTML5 本地存储与会话存储

    除了非持久性和仅限于当前窗口之外 会话存储相对于本地存储还有什么好处 性能 数据访问等 吗 本地存储 and 会话存储两者都延伸Storage 除了预期的 非持久性 之外 它们之间没有任何区别sessionStorage 也就是说 数据存储
  • 接收远程服务器返回错误:(403) 禁止消息

    我在下面的代码块上收到 远程服务器返回错误 403 Forbidden 错误消息 具体来说 这一行失败了 var 响应 HttpWebResponse request GetResponse 该代码在我的开发机器上完美运行 但在生产中却无法
  • 将 DBRef 解析为 Json

    我在 MongoDB 的规范化数据模型结构中收到以下错误 org bson codecs configuration CodecConfigurationException Can t find a codec for class com
  • 从任何函数中提取函数参数和默认值

    有没有办法从任何给定函数中提取参数及其各自的默认值outside功能 例如 给定 myfunc lt function a b 1 print c a b 我正在寻找一些会返回的函数 list a NULL b 1 或其一些变体 您正在寻找
  • 指定分页页面 - Laravel 4

    我试图 记住 用户浏览记录时所在的页面 以便当他返回列表时 他会返回到他离开的页面 如何更改分页器的 当前页面 值 我尝试过 Input set page x 但没有这样的功能 GET 页面 x 也不起作用 这是代码 list Public
  • 将独立图例合并到 ggpairs 中(采取 2)

    tl dr无法获得独立的图例 描述整个绘图中的常见颜色 ggpairs令我满意 抱歉长度 我正在尝试使用绘制 下三角 对图GGally ggpairs 用于绘制各种绘图矩阵的扩展包ggplot2 这本质上是同一个问题如何向 ggpairs
  • Django Rest Framework:使用令牌身份验证时重定向到 Amazon S3 失败

    我在 DRF 中使用令牌身份验证 并且对于某个 API 调用 想要重定向到 S3 使用类似的 URLhttps my bucket s3 amazonaws com my file path my file jpg Signature MY
  • AttributeError:“池”对象没有属性“__exit__”

    我正在使用一些多处理Python脚本multiprocessing Pool 这些脚本如下所示 from multiprocessing import Pool def f x return x x if name main with Po
  • 我什么时候应该在菜单项中使用省略号

    我什么时候应该把 放在菜单项的末尾 我似乎记得读过一些规则 但我一辈子都找不到它们 对于上下文 我正在向右键单击菜单添加属性选项 并且想知道添加它们是否合适 据我了解 这表明该选项在实际执行任何操作之前会询问您其他问题 这 3 个点实际上称
  • Sql Server 2005 - 如果不存在则插入

    互联网上有很多关于这个常见 问题 的信息 解决方案如 IF NOT EXISTS BEGIN INSERT INTO END 在我看来 它们不是线程安全的 您可能会同意 但是你能确认将exists放入单选的where子句中就可以解决sql引