【问题标题】:Merge with primary key violation与主键冲突合并
【发布时间】:2016-01-14 12:33:50
【问题描述】:

我有一个基于文件的导入东西,用户可以在其中发布要导入数据库的文件。插入新记录并更新已存在 Id 的记录。

在发布文件后 身份证名称 5傻

他们可以通过发布一个新文件来纠正这个问题 身份证名称 5 莎莉

我将文件批量插入(C# windows 服务)到批量表(Sql Server Azure v12)中。这些文件可以包含数百万行,所以我想避免遍历行。在批量插入之后,我有一个 SP,它执行合并更新/插入并更新现有行并插入新行。

我遇到的问题是当用户在同一个文件中发布一条新记录并更正同一条记录时。我在目标表上得到了 PRIMARY KEY VIOLATION。

有什么好办法解决这个问题吗?

这是一个例子:

--drop table #bulk --drop table #target create table #bulk( id int, name varchar(10) )

插入#bulk 值 (1,'John') 插入 #bulk 值(2,'Sally') 插入 #bulk 值 (3,'Paul') 插入#bulk值(4,'Gretchen') 插入#bulk值(5,'Penny') 插入 #bulk 值 (5,'Peggy')

创建表#target( id int 不为空, 名称 varchar(10), 主键(id))

合并#target为目标 using(select id, name from #bulk) 作为批量表 在 target.id = bulktable.id 匹配时更新 设置 target.name = bulktable.name 当不匹配时 插入(id,名称)值(bulktable.id,bulktable.name);

【问题讨论】:

  • 5 是#bulk 中具有不同名称的重复 ID。什么会决定哪个名称最终应该出现在#target
  • 姓氏应该以目标结尾。最初人们认为更新应该放在一个单独的后续文件中,如果是这样的话,它可以工作。第一条记录被插入,后面具有相同 id 的记录被视为更新。现在虽然要求新记录和同一记录的更新都应该能够出现在同一个文件中。在示例中,“Penny”记录是新记录,而“Peggy”记录(两者都具有预期的 id 5)是对前一个记录的更正。
  • 同一个ID中没有姓氏这种东西,你需要一些东西来订购,否则你不能确定它是姓氏,你可以在#中有一列自动增量以确定最后插入的值的批量表

标签: sql sql-server database


【解决方案1】:

这将处理 name 的最新值。

您需要一个新的 #bulk 创建脚本

CREATE TABLE #bulk
(
  row_id int identity(1,1),
  id int,
  name varchar(10)
)

这是您可以与新批量表一起使用的脚本:

;WITH CTE as
(
  SELECT
    id, name, 
    row_number() over (partition by id order by row_id desc) rn
    FROM #bulk
), CTE2 as
(
  SELECT id, name
  FROM CTE
  WHERE rn = 1
)
MERGE #target as target
USING CTE2 as bulktable
on target.id = bulktable.id
WHEN matched and 
 not exists(SELECT target.name except SELECT bulktable.name)
 -- this will handle null values. Otherwise it could simply have been: 
 -- matched and target.name <> bulktable.name
THEN update
SET target.name = bulktable.name
WHEN not matched THEN
INSERT(id, name) VALUES (bulktable.id, bulktable.name);

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2012-12-08
    相关资源
    最近更新 更多