尝试更新主键值时出错

时间:2017-11-21 07:43:41

标签: mysql sql stored-procedures

我正在尝试更新记录的所有值,包括主键值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

1 个答案:

答案 0 :(得分:1)

这是因为您的查询有效地尝试更新表的所有行:

update Users
...
where EXISTS (select user_name from users where user_name=@username1) 

这意味着,只要usersuser_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