【问题标题】:Violation of PRIMARY KEY constraint error SQL违反PRIMARY KEY约束错误SQL
【发布时间】:2011-05-23 21:03:47
【问题描述】:

这里是代码

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

但我收到此错误

消息 2627,第 14 层,状态 1,第 3 行
违反 PRIMARY KEY 约束“pkAR_Transactions”。不能 在对象“dbo.AR_Transactions”中插入重复键。
声明已终止。

我不是 SQL 专家...任何想法我做错了什么

【问题讨论】:

  • 哪个字段是主键?
  • Trans_ID 是我认为的主键...正如我所说我不知道​​ SQL...我是 mysql 和 php 开发人员,我对 sql server 2008 很陌生
  • 正如消息中明确指出的:您正在尝试将 重复值 插入到该表的主键中。解决方案:不要这样做!表的主键必须始终是唯一的 - 在任何情况下,您不能在表的两行中具有两个相同的主键值。
  • Trans_ID 是主键,但我在您的程序中看不到它...
  • Trans_ID 是什么数据类型??我们在您的语句中的任何地方都没有看到 - 它是由 SQL Server 自动生成的吗??

标签: sql sql-server-2008


【解决方案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?的方法

默认值:这是一个奇怪的选择,您可能需要询问设计数据库的人、阅读文档,或者只是自己弄清楚。无论如何,这是一个非常不常见的选择。

触发器:找到触发器并通读代码以查看它在做什么。以下是查找触发器列表的方法What is the most portable way to check whether a trigger exists in SQL Server?

替代方案:

可能有一个触发器插入到可能有问题的 AUDIT 表中。检查表是否有任何其他触发器并查看它们的作用。

【讨论】:

  • 我如何知道它们是什么
  • @Tamer:你决定哪些字段是/是主键......所以你应该(必须)知道你什么时候设计你的数据库......
  • @Marco:其他人可以设计这张桌子。
  • @Tamer:使用 SQL Server Management Studio 连接到服务器/数据库。然后使用这里的查询stackoverflow.com/questions/1525672/…
  • 我试过这个 SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name WHERE tc.CONSTRAINT_TYPE = 'Primary Key' .......... ..但这并没有给我 AR_Transactions 表的主键
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多