猿问

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

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

我一直使用类似于以下内容的方法来实现这一目标:

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语句是原子的(可能是不正确的)。

有人有什么想法吗?


慕慕森
浏览 503回答 3
3回答

慕桂英4014372

您可以使用合并: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)
随时随地看视频慕课网APP
我要回答