【问题标题】:Check for mysql ID skips php检查mysql ID跳过php
【发布时间】:2011-08-08 14:12:16
【问题描述】:

说在 mysql 中我有一列是 id,只是 int 自动递增。

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

就像说我有

5 6 7 8 10

我需要它来告诉我 9 丢失了,并为所有 id 继续此操作。有没有办法做到这一点?

谢谢

【问题讨论】:

  • AFAIK,不,没有办法(简单)。我能问一下你为什么要这样做吗?

标签: php mysql gaps-and-islands


【解决方案1】:

您需要一个包含所有值的表。然后就可以很简单地进行左连接来查找缺失的 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

【讨论】:

  • 施威特。从来没有想过这个。我希望 OP 只是为了维护而这样做一次(或几次),而不是作为公共程序的一部分。
  • 非常感谢我所需要的,是的,它只会在一周左右运行一次 :)
【解决方案2】:

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

所以你的 ID 是哈希的键,值为 1。

  1. 创建一个 for 循环

对于 (我的 $i = 1; $i {
if($hash{$i} != 1)
{
print "ID $i 丢失\n";
}
}

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

【讨论】:

    【解决方案3】:

    如果您可以忍受数据库中的第一个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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-16
      • 2017-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多