【问题标题】:How to find the next available integer in MySQL table using PHP如何使用 PHP 在 MySQL 表中查找下一个可用整数
【发布时间】:2016-12-05 04:51:09
【问题描述】:

我知道 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 查询中执行此操作的情况下执行此操作?

【问题讨论】:

    标签: php mysql


    【解决方案1】:
    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

    【讨论】:

    • 嗯,这似乎正在工作,我试图思考这是否会失败并返回已经存在但不可用的 ID。
    • 这个方法我用过一次,直到今天,从未失败:P
    • 我相信如果我的表中没有任何 id,这将失败。
    • 对;如果表中没有 任何 个 ID,它将返回空集。您是否认为这是失败取决于您。但它也“未能”考虑到 if 的可能性,例如1 是缺少的 ID...如果您的表中有 2,3,4,它将返回 5 而不是 1
    • 为解决上述问题,请将FROM the_table AS t1替换为FROM (SELECT * FROM the_table UNION DISTINCT SELECT 0 AS id) AS t1。这基本上在表中添加了一个 0 作为附加行
    【解决方案2】:

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

    【讨论】:

    • 是的,我想这是唯一的方法,问题是我的数据增长非常快,每天大约有 10,000 条记录进入,恐怕 auto_increment 会在某个时候用完。在插入多达 6-7k 的 10,000 条记录中,被删除了,所以我想我会重新使用那些已删除的 ID
    • @GGio 一个未签名的 bigint 字段将支持 18,446,744,073,709,551,615 条记录。这足以包含您的数据集吗?
    • @我没有拖延,我说“没有处理”。您的解决方案虽然可能有效,但显然包含大量处理。这对于 OP 来说可能是可以接受的,因为它不在脚本端,但它肯定需要比结构正确的表和自动增量更多的周期。
    • 我想我会重组它以使用 auto_increment 尽管@IAmNotProcrastinating 解决方案有效,但不想冒险选择相同的数字而不是可用的数字。或者遇到时间问题,因为正如我所说,我的数据增长很快,所以随着数据的增长,加入和处理数据会变慢。
    • 如果您认为它会大幅增长,最好考虑使用AUTO_INCREMENT
    【解决方案3】:

    这应该可以解决问题:

    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/

    【讨论】:

      【解决方案4】:

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

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

      假设,用户导航并单击"&lt;Prev" "Next&gt;" 按钮来导航问题。

      您只有当前 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 ) `
      

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

      【讨论】:

        猜你喜欢
        • 2010-11-27
        • 2018-02-15
        • 2010-09-24
        • 1970-01-01
        • 2018-09-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多