【问题标题】:Violation of Unique Constraint违反唯一约束
【发布时间】:2020-04-01 08:35:20
【问题描述】:

我正在尝试执行一个存储过程,将新客户插入到客户表中,然后在关联表中创建与现有客户的新关联。

这必须作为一个程序完成。

我违反了 Associations 表上的唯一约束,该约束跨越 Customer1Id、Customer2Id 和 AssociationType(这也是一个引用类型引用表的 id)。两个客户可以多次关联,但不能通过相同的关联类型。下面是一个表格来证明这一点:

存储过程如下:


CREATE PROCEDURE usp_CreateNewCustomer_Association
    @CustomerType INT,
    @FirstName VARCHAR(30),
    @LastName VARCHAR(30),
    @CompanyName VARCHAR(40) = NULL, 
    @AddressLine1 VARCHAR(30),
    @AddressLine2 VARCHAR(20) = NULL,
    @City VARCHAR(20),
    @Country VARCHAR(30),
    @DOB DATE = NULL,
    @Customer2Id INT,
    @AssociationType INT
AS
BEGIN
    INSERT INTO Customers
(CustomerType, FirstName, LastName, CompanyName, AddressLine1, AddressLine2, City, Country, DOB)
    VALUES (@CustomerType, @FirstName, @LastName, @CompanyName, @AddressLine1, @AddressLine2, @City, @Country, @DOB)

    UPDATE Associations
    SET Customer1Id = @@IDENTITY,
        Customer2Id = @Customer2Id,
        AssociationType = @AssociationType
END 

并且执行查询是(使用 cmets):

EXEC usp_CreateNewCustomer_Association
         @CustomerType = 1,         -- Personal Customer code = '1'
         @FirstName = 'Henry',
         @LastName = 'Godfrey',
         @AddressLine1 = 'Tripton Heights',
         @AddressLine2 = 'Broadspoke',
         @City = 'Sydney',
         @Country = 'Australia',
         @Customer2Id = 3,          -- There is an existing customer with the ID '3'
         @AssociationType = 43      -- Association type 43 means 'Developer' as in Customer (num) is the developer for customer 3

我得到这个错误:

消息 2627,级别 14,状态 1,过程 usp_CreateNewCustomer_Association,第 22 行
违反 UNIQUE KEY 约束“UC_Associations”。无法在对象“dbo.Associations”中插入重复键。重复键值为 (14, 3, 43)。

我对使用唯一约束不是很熟悉(这可能很明显),但我不能放弃唯一约束,所以如果有人能建议我如何纠正这个问题,我将不胜感激。

【问题讨论】:

  • 如果答案解决了您的问题,您应该将其标记为正确。这样可以确保每个人都知道这个问题已经解决了。

标签: sql sql-server unique-constraint


【解决方案1】:

您的 UPDATE 语句总是尝试更新所有列,因为您没有 WHERE 条件。

您应该更改 UPDATE 语句以包含 WHERE 条件或将其更改为 INSERT - 因为我不完全理解这应该如何仅与 UPDATE 语句一起使用。

【讨论】:

  • 啊,太简单了,谢谢!我之前遇到 INSERT INTO 错误,所以我切换到 UPDATE 但我又试了一次,一切都很好:)
【解决方案2】:

您正在尝试更新具有相同身份的所有关联

UPDATE Associations
SET Customer1Id = @@IDENTITY,
    Customer2Id = @Customer2Id,
    AssociationType = @AssociationType

没有where条件

编辑:

我发现@Larnu 的声明非常重要,因此引用它

我建议反对@@INDENTITY;它不限于当前范围。使用 SCOPE_IDENTITY 或 OUTPUT 子句来获取值。否则,您很容易得到来自不同范围的标识值。 – @Larnu

【讨论】:

  • 我反对@@INDENTITY;它不限于当前范围。使用SCOPE_IDENTITYOUTPUT 子句来获取值。否则,您很容易得到来自不同范围的标识值。
  • 感谢您澄清这一点,希望我不会再犯这个错误!我按照上面的建议切换到 INSERT INTO 语句,它可以工作。
猜你喜欢
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多