【问题标题】:SQL Inserting dupsSQL 插入副本
【发布时间】:2014-11-05 02:17:40
【问题描述】:
INSERT dbo.FileColumns(FileID,  RowID, ColumnID, Value)
SELECT FileID, RowID, ColumnID, Value FROM #TempFileColumns;

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

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

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

【问题讨论】:

  • 如果您想要所有数据,那么如果它是自动编号,则您只需不插入主键,或者如果您需要查找下一个可用 ID,则执行 MAX(Field)+1。跨度>

标签: sql-server


【解决方案1】:

您必须决定如何处理重复记录。一种技术是使用带有分区的 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(这似乎不适合这种情况)。

【讨论】:

    【解决方案2】:

    一种可能的(已经提到的)方法是不插入 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
    
      )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多