Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mySql–如何搜索可用ID_Mysql_Auto Increment - Fatal编程技术网

mySql–如何搜索可用ID

mySql–如何搜索可用ID,mysql,auto-increment,Mysql,Auto Increment,我有一个mySQL表,它存储用户列表的数据,并且有一个无符号的小整数格式的ID,0到255个条目可能作为主键。我启用了“自动增量”以自动设置关键点,目前为止效果良好 当用户注销时,我调用ALTER TABLE sj_userlist AUTO_INCREMENT=1,它执行时没有错误 但是,下一个登录的用户仍然会收到当前最高ID的ID+1 例如: 10名用户使用ID 1、2、3、4、5、6、7、8、9、10在线 用户1和2到9注销-只有ID 1和10仍在登录 新用户登录并收到ID 11,但我希望

我有一个mySQL表,它存储用户列表的数据,并且有一个无符号的小整数格式的ID,0到255个条目可能作为主键。我启用了“自动增量”以自动设置关键点,目前为止效果良好

当用户注销时,我调用ALTER TABLE sj_userlist AUTO_INCREMENT=1,它执行时没有错误

但是,下一个登录的用户仍然会收到当前最高ID的ID+1

例如:

10名用户使用ID 1、2、3、4、5、6、7、8、9、10在线 用户1和2到9注销-只有ID 1和10仍在登录 新用户登录并收到ID 11,但我希望他/她获得ID 2 如果这个行为是正确的,我如何实现一个替代解决方案,它总是从1开始递增直到找到下一个可用ID

提前感谢,, 最好的

Alex

可能的解决方案

创建用于用户注册的表。将用户名列定义为唯一。 例如,根据数据类型0-255向其中插入最大记录数。 当用户登录并需要注册时,您可以使用 这保证了用户将获得最少的可用数量,并且不会出现干扰/并发问题

当用户注销时,则使用 id现在可以免费供下一个登录的用户重新使用

如果客户端出现一些问题,并且用户未正确注销,则其姓名将保持注册状态。但当他下次登录时,他将收到相同的id-更新将失败,但SELECT将返回未释放的id


然而,您必须定期清除这些旧记录。

为什么它总是从1开始,为什么您必须在任何点重置自动增量?这实际上不是ID列的用途。你为什么要这么做?这张桌子的具体用途是什么?你为什么经常从中删除记录?如果您希望表包含许多记录,为什么不使用int而不是tinyint呢?如果这种行为是正确的,那么对于autoincrement是绝对正确的。您必须将ID分配逻辑从自动递增改为最小可用。去掉AI。而是创建一个包含256个整数和datetime的表。然后使用UPDATE以最早的日期更新整数,或者,在出现平局的情况下,最早的日期和最低的id。大概永远不会有256个用户同时登录的情况on@Akina这可能会导致并发问题,两个客户端将试图同时分配相同的ID。谢谢Akina-这确实很有用!
UPDATE table
SET name = 'Current user name'
WHERE name IS NULL
ORDER BY id
LIMIT 1;

SELECT id
FROM table 
WHERE name = 'Current user name';
UPDATE table
SET name = NULL
WHERE name = 'Current user name'