4

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

例如表结构:

 Primary Key = (ID, UserID)
 ID   UserID 
 3    6
 3    1
 1    3

现在,当我插入查询时,我想将其插入ID = 2而不是4。使用auto_increment它给了我4

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

4

4 回答 4

6
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;

我做了一个小提琴:http ://sqlfiddle.com/#!2/4d14d/2

于 2013-04-18T22:05:40.860 回答
3

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

于 2013-04-18T22:00:35.983 回答
0

这应该可以解决问题:

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)

左侧列将返回序列间隙中的第一个可用点,第二个是该特定间隙中的最高数字。

来源: http: //www.codediesel.com/mysql/sequence-gaps-in-mysql/

于 2013-04-18T22:10:07.373 回答
0

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

假设,您有属于某个 topic_id 的 question_id 的问题集。

假设,用户导航并单击"<Prev" "Next>"按钮来导航问题。

您只有当前 ID。捕捉导航的方向topic_idquestion_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 ) `

根据您的移动方向使用增量或减量

于 2016-12-04T20:33:18.377 回答