SQL插入重复项

时间:2014-11-04 18:07:28

标签: sql-server

INSERT dbo.FileColumns(FileID,  RowID, ColumnID, Value)
SELECT FileID, RowID, ColumnID, Value FROM #TempFileColumns;

我在表dbo.FileColumns上设置了这个索引: RowID上的集群唯一主键索引ColumnID

我收到此错误: 违反PRIMARY KEY约束'PK_FileColumns'。无法在对象'dbo.FileColumns'中插入重复键。

如何在插入时排除此类重复行?请帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

您必须决定如何处理重复记录。一种方法是使用带分区的ROW_NUMBER根据您定义的某个业务规则选择第一条记录,例如日期或值顺序。

INSERT dbo.FileColumns(FileID,  RowID, ColumnID, Value)
    SELECT FileID, RowID, ColumnID, Value
    FROM (
      SELECT
        ROW_NUMBER() OVER (PARTITION BY FileID ORDER BY RowID, ColumnID) AS RowNum,
        FileID,
        RowID, 
        ColumnID,
        Value 
      FROM #TempFileColumns) T
    WHERE RowNum = 1

其他技术可能是为什么在生成临时表时可能会出现重复的文件ID(可能是某处的某个错误),或者使用聚合来获取唯一的文件ID(这似乎不适合这种情况)

答案 1 :(得分:0)

一种可能的(已经提到的)方法是不插入ID,并允许表处理密钥生成(假设您将FileID设置为IDENTITY列):

INSERT dbo.FileColumns(RowID, ColumnID, Value)
SELECT RowID, ColumnID, Value 
FROM #TempFileColumns;

另一种方法,如果您正在使用可能已在表中的数据,则首先检查目的地,以确保您尚未加载它:

INSERT dbo.FileColumns(FileID,  RowID, ColumnID, Value)
SELECT FileID, RowID, ColumnID, Value 
FROM #TempFileColumns tmp
WHERE NOT EXISTS 
  (
    SELECT 1
    FROM dbo.FileColumns tbl
    WHERE tbl.FileID = tmp.FileID

  )