为什么在MySQL 5.6中,int字段的自动递增跳过'2147483646'?

时间:2018-06-06 03:46:24

标签: mysql

当我测试int自动递增主键的边界时,在MySQL 5.6中观察到了以下内容

   drop table if exists f1;
   create table f1 (
        i int(11)  not null auto_increment,
        primary key (`i`)
   )ENGINE=InnoDB AUTO_INCREMENT=2147483640 DEFAULT CHARSET=utf8;

   insert into f1 values (); -- execute this for 8 times

   select * from f1;

+------------+
| i          |
+------------+
| 2147483640 |
| 2147483641 |
| 2147483642 |
| 2147483643 |
| 2147483644 |
| 2147483645 |
| 2147483647 |
+------------+

错过了2147483646的条目。任何人都可以解释为什么会有这种行为?

没有自动增量,可以手动填充2147483646

drop table if exists f1;
create table f1 (
  i int(11)  not null ,
 primary key (`i`)
)ENGINE=InnoDB AUTO_INCREMENT=2147483640 DEFAULT CHARSET=utf8;

insert into f1 values (2147483644),(2147483645),(2147483646),(2147483647);

select * from f1;

+------------+
| i          |
+------------+
| 2147483644 |
| 2147483645 |
| 2147483646 |
| 2147483647 |
+------------+

1 个答案:

答案 0 :(得分:4)

这很有趣。我已经阅读了论坛。我认为这是MySQL的预期行为。

供参考:

  

[2015年2月18日12:54] Peter Laursen我想你应该读这个   小心   http://dev.mysql.com/doc/refman/5.5/en/example-auto-increment.html   http://dev.mysql.com/doc/refman/5.1/en/innodb-auto-increment-handling.html   http://dev.mysql.com/doc/refman/5.1/en/innodb-parameters.html#sysvar_innodb_autoinc_lock_m ...

     

之前有很多类似的报道(我发布过这样的报道)   我自己4 - 5年前)。无法保证不存在   自动增量枚举中的“漏洞”。这不是什么   'auto_increment'表示。它“递增”,但不保证   总是“加一”。

     

但如果你将'innodb_autoinc_lock_mode'设置为“0”,它很少会发生    - 如果有的话 - 发生这样的'漏洞'。

     

- 彼得    - 不是MySQL / Oracle人员。