Php sql查询仅在不是非主行的重复项时更新

Php sql查询仅在不是非主行的重复项时更新,php,mysql,sql,Php,Mysql,Sql,我有一个非常简单的php SQL查询。有人创建用户名后,他们可以将其编辑为其他内容 $uName_str = "UPDATE users SET users.username = '{$newUserName}' WHERE users.username = '{$oldUserName}'; 但我不希望他们能够将用户名更新为与其他人相同的用户名。主键是用户ID。我可以运行一个单独的查询来查找所有用户名,然后将新选择的用户名与用户名数据库进行比较,但是一个完全单独的查询似乎效率低下。有没有办法

我有一个非常简单的php SQL查询。有人创建用户名后,他们可以将其编辑为其他内容

$uName_str = "UPDATE users SET users.username = '{$newUserName}' WHERE users.username = '{$oldUserName}';

但我不希望他们能够将用户名更新为与其他人相同的用户名。主键是用户ID。我可以运行一个单独的查询来查找所有用户名,然后将新选择的用户名与用户名数据库进行比较,但是一个完全单独的查询似乎效率低下。有没有办法将其作为单个查询写入,以防止重复条目?

在用户名列上创建唯一索引。然后在更新时检查错误/异常。

运行简单的查询来检查是否使用了用户名不会被认为效率低下。这将被视为最佳做法。您还可以创建一个存储过程。但这是一个更复杂的解决方案。我不推荐罗布的答案。因为它会在你的错误日志中填入异常,让你相信这是错误,而实际上只是取了用户名。

请添加
用户名
作为唯一索引。之后,如果有人试图复制该条目,则会出现MySQL错误:

ALTER TABLE `users` ADD UNIQUE(`username`);
您所需要的一切:

ALTER TABLE users ADD UNIQUE INDEX(username);

$uName_str = "UPDATE IGNORE users SET users.username = '{$newUserName}' WHERE users.username = '{$oldUserName}';

使
username
字段在数据库中唯一,如果更新时返回阻止更改的错误,则可以显示错误消息Already为什么这些答案被否决?这个答案很好。看起来有人真的非常想要分数,以至于他们想否决其他评论。哈哈,希望这有帮助:)谢谢,存储过程在这一点上有点超出我的理解。我将尝试这两种方法,看看哪一种更适合我的需要。它不会抛出致命错误。它只是在代码中捕获并处理的触发错误或异常。这是处理这种情况的最好方法。Rob的解决方案很好,触发的异常使我能够向用户显示一条错误消息,说明他们希望选择的用户名已经很好了。