更新表提供主键冲突错误

时间:2014-11-21 18:31:16

标签: sql-server database join

我跟随两个表

create table #temp(id int,rid int)
insert into #temp
select 1,1
union all
select 2,1
union all
select 3,1

select * from #temp

drop table #temp1
create table #temp1(id int, nid int,PRIMARY KEY CLUSTERED
(
id asc,nid asc
))

insert into #temp1
select 1,10
union all
select 2,10
union all
select 2,11
union all
select 3,10

以下是两个结果集:

id  rid
1   1
2   1
3   1

id  nid
1   10
2   10
2   11
3   10

我想通过匹配两个表中的id字段来更新#temp1表,其值来自#temp表的rid字段。请参阅以下查询:

select a.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid

它返回:

id  nid
2   10
2   11
3   10

我想用以下查询更新id:

update a
set a.id = b.rid
-- select a.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid

但它返回

  由于表#temp1中的主键,

主键冲突错误。

我想删除该值,如果它已经存在,如果没有那么我想更新

例如,

id nid 1 10 2 10--想要更新但不能这个bcoz它违反主键所以删除这一行。 2 11--能够更新此行,但其他2行会导致问题。 3 10--想要更新但不能这个bcoz它违反了主键,所以删除这一行。

请建议其他方法。

2 个答案:

答案 0 :(得分:0)

因为您违反了Primary Key Constraints

检查下表

select B.*
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid

id rid
2   1
2   1
3   1



select * from #temp1

id   nid
1   10
2   10
2   11
3   10

您正在使用#temp中已加入#temp1

的连接设置上面第一个表的ID

您尝试更新已在#temp1中的值,其中id = 2,2,3

答案 1 :(得分:0)

select *
from #temp1 a inner join #temp b
on a.id = b.id
where a.id <> b.rid 

您将两个id 2记录更新为相同的值。你不能这样做,期间。没有其他方法可以解决这个问题,除了丢弃我认为不好的PK。

您可能需要在pdate中进一步定义以指定要更新的多个记录中的哪一个,或者您可能需要删除在执行更新之前可能最终为重复的记录。不了解您实际想要完成的业务规则或数据意味着什么,不可能说出您可以做些什么来解决您的问题。在这种情况下,解决方案取决于含义,当然我们在这里没有任何意义。