【问题标题】:MySQL set AUTO_INCREMENT value to MAX(id) + 1 shortcut?MySQL 将 AUTO_INCREMENT 值设置为 MAX(id) + 1 个快捷方式?
【发布时间】:2017-03-28 01:38:10
【问题描述】:

在删除部分行后,我经常需要“重置”表的 AUTO_INCREMENT 值。让我用一个实际的例子来解释:

我有一张名为CLIENT 的表。让我们说在删除一些行之前,auto_increment 设置为11。然后我删除最后 4 行。 auto_increment 仍然设置为 11。所以当我再次插入一些客户端时,它会在 id 上打一个洞。

我总是需要“清理”自动增量,例如使用下面的这个函数:

function cleanAutoIncrement($tableName, $columnAutoIncrement, $pdo)
{
    $r = false;

    try {
        $p = $pdo->prepare("SELECT IFNULL(MAX($columnAutoIncrement) + 1, 1) AS 'max' FROM $tableName LIMIT 1;");
        $p->execute();

        $max = $p->fetch(PDO::FETCH_ASSOC)['max'];

        $p = $pdo->prepare("ALTER TABLE $tableName AUTO_INCREMENT = $max;"):

        $p->execute();

        $r = true;
    }
    catch(Exception $e) {
        $r = false;
    }

    return $r;
}

该函数的作用是获取表中的最大 id,然后将其递增 1,并返回其值(如果表中没有行,则返回 1)。然后我更改表以重置“干净” id,以免出现任何 id 漏洞。

问题

是否有任何 MySQL 命令可以执行此任务而无需手动执行此操作?

【问题讨论】:

  • 被问了很多次,序列中的空白不是一个值得关注的问题
  • 让 MySQL 重置表中自动增量列的计数器的唯一方法是 截断 表(这不是您想要的)。其次,我完全同意@e4c5。为什么让 ID 始终无间断运行很重要?
  • ID 之间不需要间隔的原因是什么?正如@e4c5 提到的,在自动增量ID 中没有间隙是不可避免的。如果您需要这样的字段,最好创建另一个整数字段并手动计算/生成它(我强烈建议您避免使用它!)
  • @FDavidov:不,不是。只是考虑离开这个项目而不考虑超出范围的增量值(我们每月添加大约 200 万行,有时会有一万个 id 的“间隙”)。 EhsanT 出于同样的原因,留下代码并确保一切都很好,即使我不在办公桌后。到时候我会听从你的建议,没有间隙处理。

标签: mysql


【解决方案1】:

要关闭此问题,MySQL 中不存在快捷方式,不建议执行此任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-09
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多