为了账号安全,请及时绑定邮箱和手机立即绑定

只有在没有插入行的情况下才插入行

只有在没有插入行的情况下才插入行

慕慕森 2019-06-17 17:35:28
只有在没有插入行的情况下才插入行我一直使用类似于以下内容的方法来实现这一目标:INSERT INTO TheTableSELECT     @primaryKey,     @value1,     @value2WHERE     NOT EXISTS     (SELECT         NULL     FROM         TheTable    WHERE         PrimaryKey = @primaryKey).但一旦被加载,就会发生主密钥违规事件.这是插入到此表中的唯一语句。那么,这是否意味着上述声明不是原子的?问题是这几乎是不可能随意重建的。也许我可以将其修改为如下内容:INSERT INTO TheTableWITH     (HOLDLOCK,     UPDLOCK,     ROWLOCK)SELECT     @primaryKey,     @value1,     @value2WHERE     NOT EXISTS     (SELECT         NULL     FROM         TheTable    WITH         (HOLDLOCK,         UPDLOCK,         ROWLOCK)     WHERE         PrimaryKey = @primaryKey)不过,也许我用错了锁或者用了太多的锁什么的。我在stackoverflow网站上看到了其他一些问题,其中的答案是“if(选择count(*).插入”等),但我总是假设一个SQL语句是原子的(可能是不正确的)。有人有什么想法吗?
查看完整描述

3 回答

?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

您可以使用合并:

MERGE INTO TargetUSING (VALUES (@primaryKey, @value1, @value2)) Source (key, value1, value2)ON Target.key = Source.keyWHEN MATCHED THEN
    UPDATE SET value1 = Source.value1, value2 = Source.value2WHEN NOT MATCHED BY TARGET THEN
    INSERT (Name, ReasonType) VALUES (@primaryKey, @value1, @value2)


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 486 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信