代码之家  ›  专栏  ›  技术社区  ›  user3676604

如果自动增量值达到其极限,该怎么办?

  •  19
  • user3676604  · 技术社区  · 7 年前

    假设您有一个具有id和名称字段的InnoDB MySQL表。id字段具有BIGINT(20),并且是自动递增加上主键。

    如果这个表已经满了,这意味着我们已经达到了id的限制,并且不能再生成自动递增的数字,那么你该怎么办。

    2 回复  |  直到 7 年前
        1
  •  30
  •   axiac    7 年前

    假设表结构如下:

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

    INSERT

    INSERT INTO tbl(id) VALUES (NULL);
    

    但我们可以放心地忽略它们,因为它们对这个特定问题没有任何价值。

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

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

    身份证件 插入 查询


    无论如何,如果你的 AUTO_INCREMENT 列为 BIGINT 你不必担心。

    假设代码插入 每秒一百万条记录 (这被高估了,更不用说不可能),有足够的价值 身份证件 half of million years . 或者只是 292,277 如果该列不是 UNSIGNED


    我在一个使用 INT(11) 未签名 )作为 自动增量 ed PK用于记录网站访问信息的表格。经过几年的平稳运行,当访问次数达到时,它在半夜失败了 2^31 ( 2 几十亿)。

    更改列类型 INT BIGINT公司 不是20亿条记录表上的解决方案(需要很长时间才能完成,当系统处于活动状态时,时间永远不够)。解决方案是创建一个具有相同结构但具有 对于PK列和 列,然后切换表:

    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
  •  3
  •   mohamad mohamad    7 年前
    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)
    

    你认为这个数字是一个小数字吗? 也许在你达到这个数字之前你已经死了

    推荐文章