3

我正在使用 PHP/MySQL。检查用户名是否已被使用的最佳方法是什么?

现在我所做的就是执行一个选择语句来查看用户名是否已经被使用。如果选择返回一行,那么我停止并显示一条错误消息。如果选择没有返回任何内容,那么我插入新用户。

但是有没有更有效的方法?例如,我可以在用户名列上使用 UNIQUE,然后只执行一个插入语句(如果它已经被插入,则从插入中得到一个错误)。

4

1 回答 1

5

您确实有一些其他线程会在您的 SELECT 确认用户不存在和您插入它的 INSERT 之间的短暂时刻插入您的用户名的风险。这称为竞争条件

看起来发生这种情况的可能性很小,但有一种说法:“百万分之一是下周二。

是的,对用户名的唯一约束可以防止您插入重复的用户名。声明该约束。

有些文章会告诉你,一旦你有了一个 UNIQUE 约束,你就不必再做 SELECT 了。只需尝试INSERT,如果它冲突,则报告错误。

但是,我帮助一个站点从这种技术引起的问题中恢复过来。在他们的网站上,用户试图非常快速地创建新用户名,并在 INSERT 上导致了很多冲突。问题是MySQL 会增加表的自动增量主键,即使 INSERT 被取消。并且这些自动增量值永远不会被重用。所以结果是他们每成功插入 1000-1500 个 ID 号。当他们的 INT 主键达到 2 31 -1 并且他们无法在表中创建另一行时,他们打电话给我!

他们使用的解决方案是首先尝试 SELECT,然后报告重复。然后,如果它看起来安全,请尝试 INSERT——但无论如何都要编写代码来处理与 UNIQUE 约束可能发生的冲突,因为竞争条件仍然可能发生。

于 2012-12-01T07:48:19.713 回答