这是代码
BEGIN TRANSACTION
INSERT INTO [cresql].[dbo].[AR_Transactions]
(DateTime , Dirty, Store_ID, Trans_Type, Cashier_ID, CustNum, Trans_Amount, Prev_Cust_Balance)
SELECT
DATEADD(MINUTE, -30, Getdate()), 1, 1001, 'C', 100199,
CustNum, -Acct_Balance, Acct_Balance
FROM
[cresql].[dbo].[Customer]
WHERE
Acct_Balance <> 0
UPDATE [cresql].[dbo].[Customer]
SET Acct_Balance = -500
WHERE Acct_Balance <> 0
COMMIT TRANSACTION
但我收到此错误
Ms 2627,Level 14,State 1,Line 3
违反PRIMARY KEY约束'pkAR_Transactions'。不能 在对象'dbo.AR_Transactions'中插入重复键。
声明已经终止。
我不是SQL的专家...任何想法我做错了
答案 0 :(得分:1)
按照设计,您的表[cresql].[dbo].[AR_Transactions]
应该只包含一个主键值 - 在您的情况下,这似乎是构成此PK的列的组合。
这不是SQL问题,但似乎是一个设计概念。
您应该找出构成主键的键的组合 - 可能是设计声明您可以插入一次并稍后更新该组合(尽管我不认为这是一个好的设计)。
修改强>
由于Trans_Id是PK,并且您没有在插入中使用该列,因此它将作为IDENTITY,DEFAULT(brrrrr)或使用TRIGGER插入。
IDENTITY:检查IDENTITY规范是否搞砸了。如果是这样,只需重置它。以下是How can I reseed an identity column in a T-SQL table variable?
的方法DEFAULT:去查找设计表格的人并问他们
TRIGGER:查找触发器并阅读代码以查看其执行的操作。以下是查找触发器列表What is the most portable way to check whether a trigger exists in SQL Server?
的方法替代方案:
可能有一个触发器插入可能有问题的AUDIT表中。检查表格是否有任何其他触发器并查看它们的作用。