【问题标题】:Can i adjust the value of an auto-incremented field in the database automatically?我可以自动调整数据库中自动递增字段的值吗?
【发布时间】:2014-03-05 23:30:21
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题经常被问到。自增 id 旨在保证唯一性,而不是顺序性。如果您需要顺序排序,最好在输出时生成,因为自增主键可能会影响许多其他列。最好不要重新排序以填补删除漏洞。
  • 自动递增的主键是有原因的。如果您篡改它们,您将面临破坏数据完整性的风险。换句话说,当你删除一条记录时,你应该有“漏洞”。如果您需要以连续不间断的顺序显示您的记录编号,请在您的代码中执行此操作。
  • Using unused primary keys 的可能重复项
  • @MichaelBerkowski AFAIK,当您将一个问题作为另一个问题的副本关闭时,它本身就是一个副本,这不是一种好的做法。如果您使用的问题,这个链条很长。

标签: mysql auto-increment


【解决方案1】:

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

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

【讨论】:

  • 但是那不是浪费空间,不删除不需要的帖子吗?
  • 不...别担心。当然取决于数量,但这取决于您想要实现的目标。
  • 事实上,大多数执行某种修订任务的系统从不删除任何记录。他们只是将记录标记为已删除。但是在您的情况下,如果您不需要注意修订,您可以简单地删除记录并停止担心“漏洞”。
  • @user2619513 有什么问题?您总是以某种方式格式化数据库中的数据。 ID 通常根本不可见。这些漏洞只是记录的编号,纯粹是逻辑上的,物理上它们不需要存在于存储中。不浪费空间。请参阅我的答案的更新。
  • 显示帖子时,只会显示 SQL 查询返回的内容。如果未找到已删除的帖子,则不显示任何内容。无法理解为什么这可能是个问题。
【解决方案2】:

从结尾删除

您可以通过手动将表的AUTO_INCREMENT设置为指定值

ALTER TABLE tbl AUTO_INCREMENT = val;

参见 MySQL 手册中的Using AUTO_INCREMENT

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

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

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

如果您不想手动重新编号记录,请为此编写脚本,也不要乱用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

警告——这可能有害!

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

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

【讨论】:

    猜你喜欢
    • 2010-10-25
    • 1970-01-01
    • 2010-10-06
    • 2012-04-19
    • 1970-01-01
    • 2015-03-05
    • 2016-05-17
    • 2014-02-03
    • 2012-03-26
    相关资源
    最近更新 更多