问题描述
|
这是代码
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,-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
但我收到此错误
讯息2627,第14级,州1,第3行
违反了PRIMARY KEY约束\'pkAR_Transactions \'。不能
在对象\'dbo.AR_Transactions \'中插入重复键。
该语句已终止。
我不是SQL专业人士...任何想法我做错了
解决方法
按照设计,您的表
[cresql].[dbo].[AR_Transactions]
应该只保留一个主键值-在您的情况下,这似乎是构成此PK的列的组合。
这不是SQL问题,但似乎是一个设计概念。
您应该找出构成主键的键组合是什么-可能是设计指出您可以插入一次,然后再对该组合进行更新(尽管我认为这不是一个好的设计)。
编辑
由于Trans_Id是PK,并且您没有在插入内容中使用该列,因此它要么作为IDENTITY,作为DEFAULT(brrrrr)插入,要么使用TRIGGER。
IDENTITY:检查IDENTITY规范是否已拧紧。如果是这样,只需将其重置。这是如何更改T-SQL表变量中的标识列的方法?
默认值:这是一个奇怪的选择,您可能不得不问设计数据库,阅读文档的人,或者只是自己弄清楚它。无论如何,这是一个非常不常见的选择。
触发器:找到触发器并通读代码以查看其作用。这是查找触发器列表的方法。最简便的方法是检查SQL Server中是否存在触发器?
替代方案:
可能有一个触发器插入到可能有问题的AUDIT表中。检查表中是否还有其他触发器,然后查看它们的作用。