【问题标题】:Why do my sql tables maintain deleted id's?为什么我的 sql 表会维护已删除的 id?
【发布时间】:2016-09-21 11:48:33
【问题描述】:

当我将数据插入一个全新的表时,它将通过 AUTO_INCREMENT 分配一个新的 id。因此,第一次执行插入时,我得到的 id 为 1。但是,如果我删除该行并插入新数据,该表的行为就好像还有前一行(新行的 id 为 2)。这种行为让我很担心,因为我觉得数据仍然存在于某个地方。有什么想法吗?

【问题讨论】:

  • 您并不是唯一一个感觉数据持续存在的人。当我开始使用数据库时,我也有同样的感觉。一旦你使用了足够多的 auto_increment 字段,你就会养成使用select id, name...from tablename order by id 的习惯。如果您注意到 ID 1、3、4……您可以断定 id 2 已被删除。在某些情况下,您必须归档已删除的数据,这样可以更轻松地查看已删除的内容。

标签: mysql sql


【解决方案1】:

您的数据没有持久化。 MySql 维护一个关于您的表的单独表,其中包含表的下一个自动增量值。您可以通过以下方式重置:

ALTER TABLE tablename AUTO_INCREMENT = 1

但是,请注意,如果您要重置为低于表中另一个有效值的值,您就是在自找麻烦。

【讨论】:

  • 如何访问该信息?每次清空表时我都想从 id=1 开始(我清空表的唯一原因是出于实验和学习目的)。
  • @j3ssi3ftw - 请参阅this thread 了解更多信息。但是,只要你清空表格,只需像我建议的那样使用 ALTER TABLE 语句。
  • 您可以执行truncate table tablename; 然后ALTER TABLE tablename AUTO_INCREMENT = 1; 将自动增量重置为1
  • 好的,非常感谢您的快速帮助!如果表中存在任何数据,我肯定会避免将 id 重置为 1。
  • @j3ssi3ftw - 此外,咨询the documentation 也无妨。 :)
【解决方案2】:

你应该简单地使用。

truncate table tablename;

【讨论】:

  • 仅供 OP 考虑:截断表会将 auto_increment 字段重置为其起始值:dev.mysql.com/doc/refman/5.7/en/truncate-table.html
  • truncate table 的一个问题是,如果其他表中的任何外键引用该表,它将无法在 InnoDB 或 NDB 表上工作。它也不会调用任何ON DELETE 触发器。否则,它几乎与删除所有行并显式更改表的 AUTO_INCREMENT 值一样好(而且速度更快)。
  • 我刚刚查找了一个截断示例,它非常有用,但感谢您对异常情况的提醒。
  • 是的,即使子 FK 为空,truncate 也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多