【问题标题】:MySql Autoincrement field does NOT use the next available valueMySql Autoincrement 字段不使用下一个可用值
【发布时间】:2012-08-20 09:57:40
【问题描述】:

我定义了一个 7 位的自增 ID 字段(int(7) ZEROFILL),以便得到 0000001、0000002、0000003 等,足以让表包含多达 10 000 000 行。 一开始一切都很好。然后我注意到该字段会“跳过”整个范围。例如,它将直接从 0000100 变为 0000200。 当它直接到 9999999 时,事情变得非常复杂,这是 int(7) 允许的最后一个值,因为下一次它设置了“10000000”值,其中包含 8 个数字,而到目前为止它只使用了 0.005% int(7) 可用的值。

问题是我真的需要这个字段的 7 位格式。

有没有办法真正强制字段使用下一个可用值?

感谢您的帮助!

编辑:仅供参考,行定义是int(7) UNSIGNED ZEROFILL AUTO_INCREMENT

【问题讨论】:

  • 你能显示你的表定义吗?
  • id 的增量是固定的还是变化的?
  • 请注意,INT(7) 实际上不是 7 位字段。括号中的数字完全是另外一回事。
  • 检查自动增量变量 SHOW VARIABLES LIKE 'auto_inc%';

标签: mysql auto-increment


【解决方案1】:

使用AUTO_INCREMENT 应该可以。请参阅此SQLFiddle example。使用ZEROFILL不会影响数据,因为它仅用于数据representation

【讨论】:

    【解决方案2】:

    虽然我不确定我是否完全理解您的问题,但这不是 AUTO_INCREMENT 应该如何工作的。它基本上是一个计数器,因此它不查找下一个可用值。它只是增加计数器。

    这在实践中意味着什么?您可能有连续值:1、2、3...,但只要您手动插入更大的值(例如1000),计数器就会增加,因此下一个值是1001。即使您删除行,计数器仍将保持在1001。重置的唯一方法是发出 ALTER TABLE 语句。

    如果这不是所需的行为,则 AUTO_INCREMENT 不是适合该工作的工具。

    【讨论】:

    • 例如,为什么计数器从 2000203 跳到 9999999,而我在此期间从未删除任何行?我猜一个正常的行为应该是设置值 2000204。
    • 最简单的解释是有人,不一定是你,手动插入了这么大的ID。您是否已经有 200 万条记录?
    • 没有这样的风险 ;-) 在这个阶段,我的网站还在我的电脑上开发,还不能通过互联网访问。
    【解决方案3】:

    在插入前使用Max(Id)获取最大id,然后用Max(Id)+1

    插入下一条记录

    【讨论】:

      猜你喜欢
      • 2012-08-22
      • 2011-01-25
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多