尝试将插入表数据放入另一个表中,
但我收到以下错误:
Ms 2627,Level 14,State 1,Line 4
违反PRIMARY KEY约束' PK ___ 4__10'。无法在对象' dbo.tbl_Diagnosis_Table'中插入重复键。
似乎是两个表之间的重复主键。两个表都具有相同的字段和数据类型,不同的数据。什么查询可以解决此问题?
INSERT INTO tbl_Diagnosis_Table
SELECT *
FROM tbl_Holding_Diagnosis_Table
INSERT INTO tbl_Diagnosis_Table(Code, [Description], Comments, Discontinued)
(SELECT
Code, [Description], Comments, Discontinued
FROM
tbl_Holding_Diagnosis_Table);
答案 0 :(得分:1)
假设Code
是主键,这应该消除插入中的重复行:
INSERT INTO tbl_Diagnosis_Table (Code, [Description], Comments, Discontinued)
SELECT Code, [Description], Comments, Discontinued
FROM tbl_Holding_Diagnosis_Table
WHERE tbl_Holding_Diagnosis_Table.Code NOT IN
(SELECT Code FROM tbl_Diagnosis_Table)
如果主键是某个其他列或复合键,则可能需要使用连接。
如果您想要更新现有行并且只插入新行,则可能需要查看MERGE statement。
答案 1 :(得分:0)
你需要一个带有IN子句的WHERE要过滤要插入的记录,但首先你需要知道哪个字段是主键。
答案 2 :(得分:0)
如果您所说的是正确的,即所有值都是唯一的,则只留下一个选项。如果表tbl_diagnosis_table中有标识列,请确保在此表上将IDENTITY_INSERT设置为ON并在select中手动提供值。种子和增量可能在过去被重置。如果你错了,你必须按照别人的建议使用where子句。
答案 3 :(得分:0)
我打算建议使用Merge查询进行插入或更新,直到我注意到示例代码中的两个插入都执行相同的插入。该错误还表示错误在第4行,即第二次插入发生的位置。如果两个插入不是有问题代码的两个示例,则分辨率可能与删除其中一个插入一样简单。
否则其他答案都是正确的,需要过滤重复的行,并且必须为表启用IDENTITY_INSERT。
SET IDENTITY_INSERT tbl_Diagnosis_Table ON -- if it is necessary to have the same primary key
MERGE tbl_Diagnosis_Table AS target
USING (SELECT Code, Description, Comments, Discontinued FROM tbl_Holding_Diagnosis_Table) AS source (Code, Description, Comments, Discontinued)
ON (target.Code = source.Code)
WHEN MATCHED THEN
UPDATE SET Description = source.Description,
Comments = source.Comments,
Discontinued = source.Discontinued
WHEN NOT MATCHED THEN
INSERT (Code, Description, Comments, Discontinued)
VALUES (source.Code, source.Description, source.Comments, source.Discontinued)
END; -- missing semicolons causes errors
SET IDENTITY_INSERT tbl_Diagnosis_Table OFF
尽管做完作业。有一些很好的理由不使用Merge。