违反主键约束查询
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
【讨论】:
嗨尼克 - 谢谢你,这很好用!知道如何找出行号也很有帮助,因为我也不确定!以上是关于违反主键约束查询的主要内容,如果未能解决你的问题,请参考以下文章