我的网站上有两种类型的人,用户和访客。实际上它们是相同的,除了创建/验证过程。
目前我有两张桌子:
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 唯一,因为真实用户会将它设为零。