【发布时间】: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