Sql 执行更新时出现主键约束错误

Sql 执行更新时出现主键约束错误,sql,sql-server-2008,Sql,Sql Server 2008,我在SQL server中进行大规模更新时遇到了一些挑战。我有一个具有复合主键(studentid、login、pass)的表。他们在一个组中有一个通用的登录名和密码。我正在进行(同样的登录和传递)更新,并将他们的登录和传递设置为字段class group=x的新值。但是我得到了一个重复的主键违反错误。知道为什么吗? 谢谢鉴于您有一个奇怪的主键,很容易看出它是如何被违反的。例如,假设student 1在表中有两行: studentid login pass

我在SQL server中进行大规模更新时遇到了一些挑战。我有一个具有复合主键(studentid、login、pass)的表。他们在一个组中有一个通用的登录名和密码。我正在进行(同样的登录和传递)更新,并将他们的登录和传递设置为字段class group=x的新值。但是我得到了一个重复的主键违反错误。知道为什么吗?
谢谢

鉴于您有一个奇怪的主键,很容易看出它是如何被违反的。例如,假设student 1在表中有两行:

studentid  login     pass                group
1          bobama    reallyborninkenia   politician
1          bobama2   raisetaxes          politician
并说您更新了组
政客

update  StudentTable
set     login = 'bobama'
,       pass = 'justpwndromney'
where   [group] = 'politician'
然后您将得到一个主键冲突,因为将有两行具有相同的
(studentid、login、pass)
组合


如果这很奇怪,那是因为你的主键很奇怪。我希望主键是
(studentid)

很明显存在冲突,您正在创建表中已经存在的studentid/login/password组合。此查询应显示与建议更改冲突的现有行的位置:

select t.* from [your-table] t
join (select * from [your-table] where [class-group] = x) proposed-change
on proposed-change.[studentid] = [t.studentid]
where t.login = 'proposed-login' and t.password = 'proposed-password'

感谢您的快速响应,目前有许多行具有相同的登录/通行证,但具有唯一的studentid。我所做的就是更新登录/通行证。但我会按照你的建议试试看@Irfarino:如果studentid确实是唯一的,则studentid以外的列的更新不会导致主键冲突。请尝试从StudentTable组中按计数(*)大于1的studentid选择studentid。如果是,则studentid本身会重复,但三列的组合将是唯一的。@Irfarino:那么SQL Server引发异常肯定是错误的;-)哈哈,我知道是我,不是db,我只是想说出来看看我错过了什么。我会做一些调查,让你随时了解情况。干杯!