我可以自动调整数据库中自动递增字段的值吗?

时间:2014-02-08 13:33:31

标签: mysql auto-increment

我可以自动调整数据库中自动增量字段的值吗?

我有一个名为“post”的表,它有一个名为“pid”的字段,设置为自动递增。 用户可以在以后删除此表中的帖子,但不会调整自动递增的值。有没有办法在每次删除帖子时调整pid字段?

例如:如果我有4个条目:pid = 1,2,3,4(pid-auto-increment) 现在,如果我删除2,有没有办法更新3到2和4到3,依此类推?

2 个答案:

答案 0 :(得分:0)

为什么需要调整自动增量?使用pid唯一标识每个帖子,如果要更改,则整个DB结构将失败。自动增量的想法是基于这个原则,你不必担心自己分配数字。

如果删除记录有问题,那么您可能希望将其保留在数据库中并将其标记为已删除。他们可以使用此标志向用户显示/隐藏。

答案 1 :(得分:0)

从结尾删除

您可以通过

手动将表的AUTO_INCREMENT设置为指定值
ALTER TABLE tbl AUTO_INCREMENT = val;

请参阅MySQL手册中的Using AUTO_INCREMENT

这解决了从结尾删除 - 在添加新行之前,将AUTO_INCREMENT设置为0,它将自动设置为当前最大值加1。新插入的行将占用与已删除行相同的ID。

从任何地方删除 - 重新编号

可以手动指定具有AUTO_INCREMENT的字段的值。 AUTO_INCREMENT被忽略。如果指定已使用的值,则唯一约束将中止查询。如果指定的值大于当前最大值,则AUTO_INCREMENT会自动设置为1加1。

如果您不想手动重新编号记录,为此编写脚本,也不想混淆stored procedures,则可以使用user-defined variables

SET @id = 0;
UPDATE tbl SET id = @id := @id + 1 ORDER BY id;
SET @alt = CONCAT('ALTER TABLE tbl AUTO_INCREMENT = ', @id + 1);
PREPARE aifix FROM @alt;
EXECUTE aifix;
DEALLOCATE PREPARE aifix;

使用示例

有关详细信息,请参阅my answer to a related question

警告 - 这可能有害!

通常不需要重新编号记录。实际上它可能是有害的,因为您可能在某处(可能在DB之外)悬挂对旧记录的引用,并且它们现在再次变为有效,这可能导致混淆。这就是删除行后,表的AUTO_INCREMENT属性不会减少的原因。

您应该删除不需要的记录并停止担心漏洞。它们只是在记录的编号中,纯粹是逻辑的,物理上它们不需要存在于存储中。从长远来看,没有浪费空间。有一段时间,存储确实有漏洞。您可以通过OPTIMIZE TABLE tblALTER TABLE tbl ORDER BY column让数据库引擎摆脱它们。