【发布时间】:2012-05-03 18:16:36
【问题描述】:
涉及以下表格:
Table Product:
product_id
merged_product_id
product_name
Table Company_Product:
product_id
company_id
(Company_Product 在 product_id 和 company_id 列上都有一个主键)
我现在想对 Company_Product 运行更新以将 product_id 列设置为 merge_product_id。此更新可能会导致重复,从而触发主键违规,因此我在 where 子句中添加了“不存在”检查,我的查询如下所示:
update cp
set cp.product_id = p.merged_product_id
from Company_Product cp
join Product p on p.product_id = cp.product_id
where p.merged_product_id is not null
and not exists
(select * from Company_Product cp2
where cp2.company_id = cp.company_id and
cp2.product_id = p.merged_product_id)
但此查询因主键冲突而失败。
我认为可能发生的情况是,由于 Product 表包含具有相同 merge_product_id 的多行,因此它将成功用于第一个产品,但是当转到具有相同 merge_product_id 的下一个产品时,它将失败,因为 ' not exists' 子查询没有看到第一次更改,因为查询尚未完成并提交。
我的想法是否正确,我将如何更改查询以使其正常工作?
[编辑]一些数据示例:
Product:
product_id merged_product_id
23 35
24 35
25 12
26 35
27 NULL
Company_Product:
product_id company_id
23 2
24 2
25 2
26 3
27 4
[EDIT 2]最终我采用了这个解决方案,它使用一个临时表进行更新,然后将更新后的数据插入到原始 Company_Product 表中:
create table #Company_Product
(product_id int, company_id int)
insert #Company_Product select * from Company_Product
update cp
set cp.product_id = p.merged_product_id
from #Company_Product cp
join Product p on p.product_id = cp.product_id
where p.merged_product_id is not null
delete from Company_Product
insert Company_Product select distinct * from #Company_Product
drop table #Company_Product
【问题讨论】:
标签: sql sql-server primary-key sql-update