【问题标题】:What to do if the auto-increment value reaches its limit?如果自增值达到极限怎么办?
【发布时间】:2018-03-04 01:50:03
【问题描述】:

我正在对某天可能发生的问题进行一些研究。 假设您有一个带有 id 和 name 字段的 InnoDB MySQL 表。 id 字段具有 BIGINT(20) 并且是 AUTO_INCREMENT 加上它的主键。

如果此表已满,这意味着我们已达到 id 的限制并且无法再生成自动增量编号,您会怎么做。

【问题讨论】:

  • codetinyint:1 字节,-128 到 +127 / 0 到 255(无符号) smallint:2 字节,-32,768 到 +32,767 / 0 到 65,535(无符号) mediumint:3 字节, -8,388,608到8,388,607 / 0到16777215(无符号)INT /整数:4个字节,2,147,483,648到2147483647/0〜4294967295(无符号)BIGINT:8个字节,-9,223,372,036,854,775,808 9,223,372,036,854,775,807 / 0〜18,446,744,073,709,551,615(无符号)code
  • 然后将 bigint 转换为无符号 bigint。当它已满时,您可能已经创下了 MySQL 数据库中拥有最多数据的记录。假设你不搞乱 auto_increment 列,让它做它的工作。我的意思是,你不必担心这个。你看过最大可能的 bigint 值有多大吗?我想说 90% 的数据库用户永远不会达到 auto_increment 列中 32 位整数的上限。你说的是 64 位值。
  • 您的系统将在您达到该数量之前关闭。
  • 感谢大家的所有回答。使用无符号整数,这是一个很好的提示!谢谢:)

标签: mysql auto-increment bigint


【解决方案1】:

让我们假设一个表结构如下:

CREATE TABLE `tbl` (
    `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
);

INSERT 类似的查询:

INSERT INTO tbl(id) VALUES (NULL);

在实际代码中,表中还有其他列,它们也出现在 INSERT 查询中,但我们可以放心地忽略它们,因为它们对这个特定问题没有任何价值。

当列id 的值达到其最大值时,无法使用上述查询在表中插入更多行。下一个INSERT 失败并出现错误:

SQL 错误 (167):列 'id' 的值超出范围。

如果id 列的值存在间隙,您仍然可以插入使用表中不存在的值的行,但您必须在INSERT 查询中指定id 的值。


无论如何,如果您的AUTO_INCREMENT 列的类型是BIGINT,您不必担心。

假设代码每秒插入一百万条记录(这被高估了,并不是说不可能),id 列有足够的值用于下一个half of million years。或者如果该列不是UNSIGNED,则只需292,277 年。


我目睹了使用INT(11)(而不是UNSIGNED)作为AUTO_INCREMENTed PK 的实时网络服务器上的行为,该表记录了有关网站访问的信息。它在深夜失败了,经过几年的平稳运行,访问量达到了2^312十亿之类的)。

将列类型从 INT 更改为 BIGINT 不是解决 20 亿记录表的解决方案(需要很长时间才能完成,并且当系统处于活动状态时,时间永远不够用)。解决方案是创建一个具有相同结构的新表,但 PK 列使用 BIGINTAUTO_INCREMENT 列使用初始值,然后切换表:

CREATE TABLE `tbl_new` (
    `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`id`)
) AUTO_INCREMENT=2200000000;

RENAME TABLE `tbl` TO `tbl_old`, `tbl_new` TO `tbl`;

【讨论】:

  • 我有同样的解决方案,现在我得到了你的确认。谢谢
【解决方案2】:
tinyint: 1 byte, -128 to +127 / 0 to 255 (unsigned)
smallint: 2 bytes, -32,768 to +32,767 / 0 to 65,535 (unsigned)
mediumint: 3 bytes, -8,388,608 to 8,388,607 / 0 to 16,777,215 (unsigned)
int/integer: 4 bytes, -2,147,483,648 to +2,147,483,647 / 0 to 4,294,967,295 (unsigned)
bigint: 8 bytes, -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 / 0 to 18,446,744,073,709,551,615 (unsigned)

你以为这个数字很小吗? 也许你在达到这个数字之前就已经死了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多