如何使用PHP在MySQL表中查找下一个可用整数

如何使用PHP在MySQL表中查找下一个可用整数,php,mysql,Php,Mysql,我知道自动递增是一种方法,但我不能使用自动递增功能,因为我表格中的列可能会重复,它不是唯一的。当我向表中插入新行时,我需要一种方法来找到下一个可用位置来插入它 例如,表结构: Primary Key = (ID, UserID) ID UserID 3 6 3 1 1 3 现在,当我插入查询时,我想将其设置为ID=2,而不是4。通过自动增量它给我4 有没有在PHP中不使用循环的解决方案?到目前为止,我所拥有的是将所有行提取到数组中,然后在ID中找到下一个可用的

我知道自动递增是一种方法,但我不能使用自动递增功能,因为我表格中的列可能会重复,它不是唯一的。当我向表中插入新行时,我需要一种方法来找到下一个可用位置来插入它

例如,表结构:

 Primary Key = (ID, UserID)
 ID   UserID 
 3    6
 3    1
 1    3
现在,当我插入查询时,我想将其设置为ID=2,而不是4。通过自动增量它给我4


有没有在PHP中不使用循环的解决方案?到目前为止,我所拥有的是将所有行提取到数组中,然后在ID中找到下一个可用的数字。是否可以不在PHP中提取所有行并在MySQL查询中执行此操作?

不,不处理数据是不可能的。纠正此问题的首选方法是调整表结构以支持唯一的、可自动递增的字段。否则,您将不得不处理数据(用PHP或通过SQL语句)以找到打开的插槽

SELECT t1.id+1 AS MISSING_ID
FROM the_table AS t1
LEFT JOIN the_table AS t2 ON t1.id+1 = t2.id
WHERE t2.id IS NULL
ORDER BY t1.id LIMIT 1;

我做了一把小提琴:

这应该可以做到:

SELECT
  min_table.ID+1 AS start,
  MIN(max_table.ID) - 1 AS end
FROM
  your_table AS min_table,
  your_table AS max_table
WHERE
  min_table.ID < max_table.ID
GROUP BY
  min_table.ID
HAVING
  start < MIN(max_table.ID)
选择
最小表格ID+1作为起始,
最小值(最大表ID)-1作为结束
从…起
您的_表作为min_表,
您的_表作为max_表
哪里
最小表ID<最大表ID
分组
min_table.ID
有
开始<最小值(最大表ID)
左侧列将返回序列间隙中的第一个可用点,第二个是该特定间隙中的最大值


来源:

未加载项目的我的解决方法:

假设您有一个问题集,其问题id属于某个主题id

假设,用户导航并单击
按钮来导航问题

你只有当前id。抓住导航的方向,主题id问题id你可以做一个循环

  do {

  // query base, doing question_id++ or question_id-- depending on needed    direction until you find next id within topic_id 

  } while( id!=null ) `

根据移动方向使用递增或递减

是的,我想这是唯一的方法,因为我的数据增长非常快,每天大约有10000条记录进入,恐怕自动递增会在某个时候用完。插入的10000条记录中有6-7k条被删除,所以我想我会重新使用那些被删除的记录IDs@GGio未签名的bigint字段将支持18446744073709551615条记录。这足以容纳你的数据集吗?@我不是在拖延,我说“不进行处理”。你的解决方案,虽然可能有效,但显然包括大量的处理。这可能是OP可以接受的,因为它不在脚本端,但它肯定需要比正确结构的表和自动增量更多的周期。我想我会重新构造它以使用自动增量,尽管@iamnotdelaying解决方案有效,不要冒着选择相同号码而不是可用号码的风险。或者遇到了时间问题,因为正如我所说,我的数据增长很快,所以加入和处理数据会随着我的数据增长而变慢。如果您认为数据会大量增长,最好考虑使用
自动增量
。嗯,这似乎起到了作用,我试着想想这是否会失败,并返回已经存在但不可用的ID。我曾经使用过这种方法,直到今天,从未失败过:我相信如果我的表中没有任何ID,这将失败。对;如果表中没有任何ID,它将返回空集。你是否认为失败是由你自己决定的。但它也“无法”解释是否有可能,例如1是缺少的ID。如果表中有2,3,4,它将返回5而不是1。要解决上述问题,请将表中的
替换为t1
,将
替换为t1
。这基本上会在表中添加一个0作为附加行