违反唯一约束

时间:2019-12-07 17:33:07

标签: sql sql-server unique-constraint

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

这必须作为一个过程来完成。

我违反了横跨Customer1Id,Customer2Id和AssociationType的Associations表的唯一约束(这也是一个引用类型引用表的id)。两个客户可以多次关联,但不能通过相同的关联类型关联。这是演示此情况的表:

Associations Table

存储过程如下:


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 

执行查询为(带有注释):

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)。

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

2 个答案:

答案 0 :(得分:2)

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

您应该更改UPDATE语句以包含WHERE条件,或者将其更改为INSERT-因为我不完全了解仅适用于UPDATE语句的情况。

答案 1 :(得分:1)

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

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

没有条件

编辑:

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

  

我建议反对@@ INDENTITY;它不限于当前范围。使用SCOPE_IDENTITY或OUTPUT子句获取值。否则,您很容易以不同范围的身份值结束。 – @Larnu