检查mysql ID是否跳过php

时间:2011-08-08 14:12:16

标签: php mysql gaps-and-islands

在mysql中说我有一个id为id的列,只是int auto increment。

有什么方法可以使用php告诉我什么时候有一个被删除的ID?

就像说我有

5 6 7 8 10

我需要它告诉我9缺少,并继续这个所有的ID。有没有办法做到这一点?

由于

3 个答案:

答案 0 :(得分:2)

您需要一个包含所有值的表。然后,做一个左连接很容易找到缺失的ID。

create table all_values
(id int not null) engine = myisam;

insert into all_values (id) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

create table existing_values like all_values;

insert into existing_values (id) values (5),(6),(7),(8),(10);

select a.id from all_values as a
left join existing_values as b
on a.id = b.id
where b.id is null

答案 1 :(得分:2)

这是一种方法:
1.从表格中选择所有ID 2.将它们全部分配给%哈希:
5 => 1
6 => 1
7 => 1
8 => 1
10 => 1个

因此,您的ID是哈希的键,值为1.

  1. 创建for循环
  2. for(my $ i = 1; $ i< 11; $ i ++)
    {
    if($ hash {$ i}!= 1)
    {
    打印“ID $ i缺失\ n”;
    }
    }

    这是Perl语法,但PHP应该非常相似。

答案 2 :(得分:2)

如果您在数据库中的第一个ID(以及使用'temporary table', 'filesort' and 'join buffer'的查询)之前没有获得之间的差距:

SELECT
    a.id + 1 AS `From`,
    MIN(b.id - 1) AS `To`
FROM
    foo as a, foo as b
WHERE
    a.id < b.id
GROUP BY
    a.id
HAVING
    a.id < min(b.id) -1

自包含的例子:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// usually I create temporary tables for example scripts, but
// self-joins don't work on temp tables in mysql, bare me....
$pdo->exec('CREATE TABLE soFoo ( id int, primary key(id))');
$pdo->exec('INSERT INTO soFoo (id) VALUES (5),(6),(7),(8),(10),(15),(21)');

foreach( $pdo->query('
    SELECT
        a.id + 1 AS `From`,
        MIN(b.id - 1) AS `To`
    FROM
        foo as a, foo as b
    WHERE
        a.id < b.id
    GROUP BY
        a.id
    HAVING
        a.id < min(b.id) -1', PDO::FETCH_ASSOC) as $row
) {
    echo $row['From'], ' - ', $row['To'], "\n";
}

打印

9 - 9
11 - 14
16 - 20