我网站上有两种用户类型:注册用户和访客。实际上,它们几乎相同,除了创建/认证过程。
目前我有两个表:
t_users
userId[PRIMARY, AUTOINC] username[UNIQUE]
t_guests
guestId[PRIMARY, AUTOINC] userId
当有人进入网站时,脚本将执行以下操作:
1)通过向t_guests插入新行创建新的访客记录。
2)使用上一步生成的guestId将新记录添加到t_users中(访客用户名=“Guest guestId”)。
3)更新访客记录,设置分配给步骤2的userId。
我认为这种数据库设计很糟糕,因为它包含许多漏洞。例如,如果用户名“Guest xyz”已经存在于t_users表中,则第2步将失败,并且第3步将为userId分配错误的值(取决于实现,它将是0或在步骤1中分配的guestId)。
实际上,我只需要t_guests表的自动递增功能来生成唯一的访客用户名。是否有一种方法可以仅使用一个合并的表格,并使用单个查询注册访客?
更新:我可以执行以下操作以在单个表中插入访客:
SELECT @mg := IFNULL(MAX(guestId), 0) + 1 FROM t_users;
INSERT INTO t_users (guestId) VALUES(@mg);
但是我不能确定,在这两个语句的执行之间,没有人插入一个新的客户记录到 t_users 表中。而且我也不能将 guestId 设为唯一值,因为真正的用户会将其设为零。