Sql server 违反主键约束-SQL Server

Sql server 违反主键约束-SQL Server,sql-server,function,parameters,primary-key,star-schema,Sql Server,Function,Parameters,Primary Key,Star Schema,在我的SQL Server中,我创建了一个数据库,并尝试将下面列出的两个表中的值导出到我在数据库中创建的新表中 但我总是犯这个错误 违反主键约束“PK\u DM\u Locat\u BA8F50140E575579”。无法在对象“dbo.DM_位置”中插入重复键。重复的键值为(1) 我的代码: INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode) SELECT AuthorityId, Faci

在我的SQL Server中,我创建了一个数据库,并尝试将下面列出的两个表中的值导出到我在数据库中创建的新表中

但我总是犯这个错误

违反主键约束“PK\u DM\u Locat\u BA8F50140E575579”。无法在对象“dbo.DM_位置”中插入重复键。重复的键值为(1)

我的代码:

INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode)
    SELECT AuthorityId, FacilityAddress, FacilityPostcode
    FROM dbo.2015_2016 
    UNION 
    SELECT DISTINCT AuthorityId, FacilityAddress, FacilityPostcode 
    FROM dbo.2016_2017

任何帮助都将不胜感激!谢谢

问题在于,您有两个表的
权限Id
值为1,但它们在
设施地址
设施PostCode
中的值不同。由于在表
DM_Location
中有主键约束,因此会产生主键冲突错误

要解决此问题,可以删除主键约束:

ALTER TABLE DM_Location
DROP CONSTRAINT PK__DM_Locat__BA8F50140E575579;

当然,如果您想在表上保留主键,您必须处理产生的错误,但这实际上取决于您希望保留主键的原因。

问题是,您有两个表的
Authority\u Id
值为1,但它们在
FacilityAddress
FacilityPostcode
中具有不同的值。由于在表
DM_Location
中有主键约束,因此会产生主键冲突错误

要解决此问题,可以删除主键约束:

ALTER TABLE DM_Location
DROP CONSTRAINT PK__DM_Locat__BA8F50140E575579;

当然,如果您想在表上保留主键,您必须处理产生的错误,但这实际上取决于您希望保留主键的原因。

看起来您的两个表有重复项。你必须排除他们。我可以猜测,最近的数据“更准确”,以下查询可能会起作用:

INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode)
SELECT AuthorityId, FacilityAddress, FacilityPostcode
FROM dbo.2015_2016 
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM dbo.2016_2017)
UNION 
SELECT AuthorityId, FacilityAddress, FacilityPostcode 
FROM dbo.2016_2017
此外,为了确保目标表中没有这些记录,并且您不想截断它,您可以尝试以下操作:

INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode)
SELECT AuthorityId, FacilityAddress, FacilityPostcode
FROM dbo.2015_2016 
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM dbo.2016_2017)
    and AuthorityId NOT IN (SELECT AuthorityId FROM DM_Location)
UNION 
SELECT AuthorityId, FacilityAddress, FacilityPostcode 
FROM dbo.2016_2017
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM DM_Location);

看起来您的两个表有重复项。你必须排除他们。我可以猜测,最近的数据“更准确”,以下查询可能会起作用:

INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode)
SELECT AuthorityId, FacilityAddress, FacilityPostcode
FROM dbo.2015_2016 
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM dbo.2016_2017)
UNION 
SELECT AuthorityId, FacilityAddress, FacilityPostcode 
FROM dbo.2016_2017
此外,为了确保目标表中没有这些记录,并且您不想截断它,您可以尝试以下操作:

INSERT INTO DM_Location (Authority_Id, FacilityAddress, FacilityPostcode)
SELECT AuthorityId, FacilityAddress, FacilityPostcode
FROM dbo.2015_2016 
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM dbo.2016_2017)
    and AuthorityId NOT IN (SELECT AuthorityId FROM DM_Location)
UNION 
SELECT AuthorityId, FacilityAddress, FacilityPostcode 
FROM dbo.2016_2017
WHERE AuthorityId NOT IN (SELECT AuthorityId FROM DM_Location);

另外-您的
选择。。。UNION
很奇怪-要使其正常工作,任何由UNION组合的部分必须返回相同数量的列-第一部分返回3列,第二部分返回4列…还有-您的
选择。。。UNION
很奇怪-为了让它工作,任何由UNION组合的部分必须返回相同数量的列-第一部分返回3列,第二部分返回4列…感谢您的回复!这确实有帮助,我将两个表与数据结合起来,并设法将其中的值提取到新表中!谢谢你的帮助谢谢你的回复!这确实有帮助,我将两个表与数据结合起来,并设法将其中的值提取到新表中!谢谢你的帮助谢谢你的回复,我会试试的!谢谢你的回复,我会试试的!