SQL语句错误表到表

时间:2014-10-01 20:37:47

标签: sql sql-server

尝试将插入表数据放入另一个表中,

但我收到以下错误:

  

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);

4 个答案:

答案 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。