3

我的网站上有两种类型的人,用户和访客。实际上它们是相同的,除了创建/验证过程。

目前我有两张桌子:

t_users

userId[PRIMARY, AUTOINC] username[UNIQUE]

t_guests

guestId[PRIMARY, AUTOINC] userId

当有人进入站点时,脚本会执行以下操作:

1) 通过向 t_guests 插入新行来创建新的访客记录

2) 使用上一步生成的 guestId 将新记录添加到 t_users (guest username = “Guest guestId”)

3) 更新在步骤 2 中分配的访客记录设置 userId

我觉得这种数据库设计很糟糕,因为它包含许多漏洞。例如,如果用户名“Guest xyz”已存在于 t_users 表中,则步骤 2 将失败,步骤 3 将为 userId 分配错误的值(取决于实现,它将是 0 或 guestId,在步骤 1 中分配)。

实际上,我只需要 t_guests 表的自动增量功能来为客人生成唯一的用户名。有没有办法只使用一个合并表并使用单个查询注册客人?

更新:我可以执行以下操作在单个表中插入客人:

SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;

INSERT INTO t_users (guestId) VALUES(@mg);

但我不能确定,在这两个语句的执行之间,没有人在 t_users 中插入新的访客记录。而且我不能让 guestId 唯一,因为真实用户会将它设为零。

4

1 回答 1

1

如果您只有 1 个带有“用户 ID、用户名、类型”的表

对于用户名,您可以使用脚本生成 Guid 并将其用作用户名或其他随机变量。如果您使用 GUID,则几乎不可能有 2 个 guid 发生冲突。

此外,如果您确实有 2 个用户名发生冲突,如果您确保用户名列必须是唯一的,那么插入将失败,您可以再试一次。

你绝对不能在这里只有一张桌子。

于 2012-09-08T06:03:50.510 回答