当我测试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 |
+------------+
答案 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人员。