违反主键约束查询

Posted

技术标签:

【中文标题】违反主键约束查询【英文标题】:Violation of Primary Key Constraint Query 【发布时间】:2014-09-17 13:22:22 【问题描述】:

我想知道是否有人可以帮助我编写下面的 SQL 代码。我正在尝试将我的 BC_completions 表中的所有记录插入到我的 Geodata 表中。如果我在插入时排除 ID 列,我会得到一个“消息 515 ... 无法将值 NULL 插入到列“ID”中。但是,如果我将其包含在下面,我会收到“Msg ...违反 PRIMARY KEY 约束”。

更令人困惑的是,如果我手动输入从 @PK 获得的值,数据库会接受它,所以这里的任何帮助都会很棒。

谢谢

DECLARE @PK AS INT
DECLARE @COUNT AS INT
DECLARE @RECORDCOUNT AS INT

SET @PK = 
(SELECT TOP 1 ID FROM PRCORE.DBO.GEODATA
ORDER BY ID DESC)


SET @RECORDCOUNT =
(SELECT  COUNT(*) FROM BC_COMPLETIONS)


SET @COUNT = 0

WHILE @COUNT < @RECORDCOUNT  
BEGIN
SET @PK = @PK+1
SET @COUNT = @COUNT+1

INSERT INTO PRCORE.DBO.GEODATA     
(ID,RecordType,ReferenceName,LocationDescription,Description,ORN,StartDate,ChgText)
SELECT @PK,189,REFVAL,ADDRESS,DSCRPN,ORN,RECPTD,AGTNAME
FROM BC_COMPLETIONS B

where @PK not in (select ID from prcore.dbo.geodata)

END   

【问题讨论】:

为什么不使用自动递增的标识列,这样您就不必执行任何这些操作了? 嗨,Michael,因为我不知道如何创建,而且我从未创建过 Geodata 表,因此不知道如何检查此 ID 列是否已经出现这种情况。 如果您使用 SSMS 右键单击​​表,选择 Script Table as -> CREATE TO -> New Query Editor Window。复制并粘贴上面的结果。它将向您显示有关该表的所有信息,包括它是否是这样创建的。 谢谢 Michael - 我也是通过查看 ID 列的列属性发现的,Identity Specification 设置为 No。所以我的理解是这不是一个自动递增的列。跨度> 【参考方案1】:

这是您的循环和插入语句的 WHERE 约束的问题。您正在从 BC_COMPLETIONS 中选择所有记录并将它们分配给同一个 PK。

相反,使用 ROW_NUMBER() 函数来分配您的 PK,这将允许您一次完成所有操作,而不是一次只记录一条:

DECLARE @PK AS INT
DECLARE @RECORDCOUNT AS INT

SET @PK = (SELECT TOP 1 ID FROM PRCORE.DBO.GEODATA ORDER BY ID DESC) + 1

SET @RECORDCOUNT = (SELECT  COUNT(*) FROM BC_COMPLETIONS)

INSERT INTO PRCORE.DBO.GEODATA (ID,RecordType,ReferenceName,LocationDescription,Description,ORN,StartDate,ChgText)
SELECT ROW_NUMBER() OVER(ORDER BY REFVAL) + @PK ,189,REFVAL,ADDRESS,DSCRPN,ORN,RECPTD,AGTNAME
FROM BC_COMPLETIONS B

【讨论】:

嗨尼克 - 谢谢你,这很好用!知道如何找出行号也很有帮助,因为我也不确定!

以上是关于违反主键约束查询的主要内容,如果未能解决你的问题,请参考以下文章

System.Data.SqlClient.SqlException:'违反主键约束

如何以编程方式禁用主键约束?

违反主键约束,多个用户

更新时SQL违反主键约束

Hibernate 和 HSQLDB 违反主键完整性约束

ORA-02292违反完整约束和ORA-02297无法禁用约束条件 cascade禁用主键