首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >违反主键约束查询

违反主键约束查询
EN

Stack Overflow用户
提问于 2014-09-17 13:22:22
回答 1查看 174关注 0票数 0

我想知道是否有人能帮助我完成下面的SQL代码。我正在尝试将BC_completions表中的所有记录插入到地理数据表中。如果排除insert上的ID列,则会得到'Msg 515.无法将值NULL插入'ID‘列。但是,如果我将它包括在下面,我会得到一个'Msg ...Violation的主键约束‘。

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

谢谢

代码语言:javascript
复制
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   
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-17 13:31:44

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

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

代码语言:javascript
复制
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
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25891822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档