MySQL 在 AUTO INCREMENT 列存储零值

由于业务改动,打算在某表加上一个 id 为 0 的记录,但是发现了个有趣的事情:id 自增了,而不是 0

重现

首先新建一个测试表演示一下:

> CREATE TABLE `t_user`(`id` INTEGER PRIMARY KEY AUTO_INCREMENT, `name` VARCHAR(32) NOT NULL);
> INSERT INTO `t_user`(`id`, `name`) VALUES(0, 'foo');
> SELECT * FROM `t_user`;
id name
1 foo

解决

可以看 id 不是所期望的 0,经过一番搜索得知,MySQL 一般情况下,自增列在值为 null0 时,其值会自增。
既然是指一般情况下,也就是说可以修改这个默认行为,而这个配置就是 NO_AUTO_VALUE_ON_ZERO
按字面理解就是自增列值为 0 时,不使用下一个序列号,我们不妨测试一下。

> SET SESSION sql_mode="NO_AUTO_VALUE_ON_ZERO";
> INSERT INTO `t_user`(`id`, `name`) VALUES(0, 'bar');
> SELECT * FROM `t_user`;
id name
0 bar
1 foo

可以看到,id 终于正常了。

注意:本文例子只是临时设置了 sql_mode,如果需要永久有效,请修改配置文件并重启。
另外,不建议自增列存储零值,如果要这么做,请确保设置了 NO_AUTO_VALUE_ON_ZERO,否则会出现意想不到的问题。
比如将本地 mysqldump 导出数据导入到未设置 NO_AUTO_VALUE_ON_ZERO 的服务端时,就会出现数据不一致的问题。

相关内容

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据