相关疑难解决方法(0)

只有在它不存在的情况下才插入一行

我总是使用类似下面的东西来实现它:

INSERT INTO TheTable
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WHERE
        PrimaryKey = @primaryKey)
Run Code Online (Sandbox Code Playgroud)

...但是一旦加载,就会发生主键违规.这是唯一插入此表的语句.那么这是否意味着上述陈述不是原子的?

问题是,这几乎不可能随意重建.

也许我可以将其更改为以下内容:

INSERT INTO TheTable
WITH
    (HOLDLOCK,
    UPDLOCK,
    ROWLOCK)
SELECT
    @primaryKey,
    @value1,
    @value2
WHERE
    NOT EXISTS
    (SELECT
        NULL
    FROM
        TheTable
    WITH
        (HOLDLOCK,
        UPDLOCK,
        ROWLOCK)
    WHERE
        PrimaryKey = @primaryKey)
Run Code Online (Sandbox Code Playgroud)

虽然,也许我使用错误的锁或使用过多的锁定或其他东西.

我在stackoverflow.com上看到了其他问题,其中答案是建议"IF(SELECT COUNT(*)... INSERT"等),但我总是在(可能是不正确的)假设单个SQL语句是原子的.

有没有人有任何想法?

sql t-sql sql-server concurrency locking

68
推荐指数
3
解决办法
3万
查看次数

在SQL Server 2005上INSERT WHERE COUNT(*)= 0上违反UNIQUE KEY约束

我从多个进程插入一个SQL数据库.过程有时可能会尝试将重复数据插入表中.我试图以一种处理重复的方式编写查询,但我仍然得到:

System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UK1_MyTable'. Cannot insert duplicate key in object 'dbo.MyTable'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

我的查询看起来像:

INSERT INTO MyTable (FieldA, FieldB, FieldC)
SELECT FieldA='AValue', FieldB='BValue', FieldC='CValue'
WHERE (SELECT COUNT(*) FROM MyTable WHERE FieldA='AValue' AND FieldB='BValue' AND FieldC='CValue' ) = 0
Run Code Online (Sandbox Code Playgroud)

约束'UK1_MyConstraint'表示在MyTable中,3个字段的组合应该是唯一的.

我的问题:

  1. 为什么这不起作用?
  2. 我需要进行哪些修改才能因违反约束而无法出现异常?

请注意,我知道还有其他方法可以解决"INSERT if not exists"的原始问题,例如(摘要):

  • 使用TRY CATCH
  • 如果不存在INSERT(在具有可序列化隔离的事务中)

我应该使用其中一种方法吗?

编辑1个 SQL用于创建表:

CREATE TABLE [dbo].[MyTable](
  [Id] [bigint] IDENTITY(1,1) NOT NULL,
  [FieldA] [bigint] NOT NULL,
  [FieldB] [int] NOT NULL,
  [FieldC] [char](3) NULL,
  [FieldD] [float] …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2005

21
推荐指数
2
解决办法
3万
查看次数

标签 统计

sql-server ×2

concurrency ×1

locking ×1

sql ×1

sql-server-2005 ×1

t-sql ×1