我的网站上有两类人,用户和来宾。实际上它们是相同的,除了创建/授权过程。
目前我有两张桌子:
t_users
userId[PRIMARY, AUTOINC] username[UNIQUE]
t_guests
guestId[PRIMARY, AUTOINC] userId
当某人进入该网站时,脚本会执行以下操作:
1)通过向t_guests
添加新行来创建新的访客记录2)使用上一步生成的guestId(guest username =“Guest guestId”)将新记录添加到t_users
3)更新在第2步分配的访客记录设置userId
我觉得这个数据库设计很糟糕,因为它包含很多漏洞。例如,如果t_users表中已经存在用户名“Guest xyz”,则步骤2将失败,步骤3将为userId分配错误的值(取决于实现它将为0或guestId,在步骤1中分配)。
实际上我只需要t_guests表来实现其自动增量功能,即可为guest虚拟机生成唯一的用户名。有没有办法只使用一个统一表并使用单个查询注册客户?
更新:我可以执行以下操作以在一个表中插入来宾:
SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;
INSERT INTO t_users (guestId) VALUES(@mg);
但我无法确定,没有人在执行这两个语句之间在t_users中插入新的guest记录。而且我无法使guestId独一无二,因为真正的用户将其等于零。
答案 0 :(得分:1)
如果你只有一张表“ userID,用户名,类型
对于用户名,您可以使用脚本生成Guid并将其用作用户名或其他随机变量。如果您使用GUID,则几乎不可能有2个guid碰撞。
此外,如果您确实要确保用户名列必须是唯一的,则确实有2个用户名发生冲突,那么插入将失败,您可以再试一次。
你肯定要在这里有一张桌子。