【发布时间】:2018-06-12 13:31:37
【问题描述】:
我正在编写一个查询以将数据从一个表导入到一个新表。我需要插入新表中不存在的记录,并更新确实存在的记录。我正在尝试使用 MERGE "upsert" 方法。
由于客户端的数据库和应用程序结构,我遇到了一些独特的问题。我要插入的表有一个唯一 ID 字段,每个新行递增 1,但表不会自动递增; insert语句需要拉取目标表中的最高ID,新记录加1。
根据我的研究,我无法弄清楚如何使用 MERGE 做到这一点。我没有创建序列的数据库权限。我已经尝试了很多东西,但目前我的查询看起来像:
MERGE
dbo.targetTable as target
USING
dbo.sourceTable AS source
ON
target.account_no = source.account_ID
WHEN NOT MATCHED THEN
INSERT (
ID,
FIELD1,
FIELD2,
FIELD3
) VALUES (
(SELECT MAX(ID) + 1 FROM dbo.targetTable),
'field1',
'field2',
'field3'
)
然后我在使用此代码时遇到的问题是,它似乎只为新 ID 运行一次 select 语句。也就是说,如果目标表中的最高 ID 是 10,它将插入 ID 为 11 的每条新记录。这将不起作用,因为我得到了
Violation of PRIMARY KEY constraint. Cannot insert duplicate key in object 错误。我一直在做大量的谷歌搜索并尝试不同的事情,但一直无法弄清楚这一点。任何帮助表示赞赏,谢谢。
编辑:为澄清起见,唯一 ID 列不会自动填充。如果我没有为 ID 列插入值,我会得到
Cannot insert the value NULL into column 'ID', table 'dbo.targetTable'; column does not allow nulls. UPDATE fails.
同样,正如我最初提到的,我没有创建序列的权限。它只是抛出一个错误并说我没有权限这样做。
我同意将 ID 列自动更改为自动递增是完美的,但我也没有能力像那样修改表格。
【问题讨论】:
-
您是否有机会将
ID列更改为具有IDENTITY 属性以便它自己处理?我认为这是一个完美的用例。
标签: sql sql-server primary-key sql-server-2016 sql-merge