我正在尝试更新记录的所有值,包括主键值user_name
,所以我所做的就是创建了一个保存当前用户名的变量@username1
(所以我可以在where子句中使用它,@username
保存我想要更新它的用户名的新值。
然而,每次执行该过程时,都会出错:
违反PRIMARY KEY约束'PK__Users__7C9273C5C682108D'。无法在对象'dbo.Users'中插入重复键
alter proc updateinfo
@username1 varchar(20),
@username varchar(20),
@password varchar(15) ,
@personal_email varchar(50),
@experience int ,
@date_of_birth datetime ,
@first_name varchar(20),
@middle_name varchar(20) ,
@last_name varchar(20)
as
begin
update Users
set user_name=@username, password=@password, personal_email=@personal_email,
experience=@experience, date_of_birth=@date_of_birth,
first_name = @first_name, middle_name=@middle_name, last_name=@last_name
where EXISTS (select user_name from users where user_name=@username1)
end
答案 0 :(得分:1)
这是因为您的查询有效地尝试更新表的所有行:
update Users
...
where EXISTS (select user_name from users where user_name=@username1)
这意味着,只要users
中user_name
等于您的输入@username1
的行,所有行users
将会{更新 - 因为无论考虑更新哪一行,EXISTS
条件都将为真。幸运的是,这样的更新将失败,因为它会尝试将多个user_name
设置为相同的值。
您可能想要做的是:
update Users
set user_name=@username, password=@password, personal_email=@personal_email,
experience=@experience, date_of_birth=@date_of_birth, first_name = @first_name,
middle_name=@middle_name, last_name=@last_name
where user_name=@username1