我正在尝试执行一个存储过程,该过程将一个新客户插入到customers表中,然后在关联表中创建一个与现有客户的新关联。
这必须作为一个过程来完成。
我违反了横跨Customer1Id,Customer2Id和AssociationType的Associations表的唯一约束(这也是一个引用类型引用表的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
执行查询为(带有注释):
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)。
我对使用唯一性约束不是很熟悉(这很明显),但是我不允许放弃唯一性约束,所以如果有人可以建议我如何纠正这个唯一性约束,我将不胜感激。
答案 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