当前位置: 代码网 > it编程>数据库>Mysql > MySQL自增主键ID设置为0有坑

MySQL自增主键ID设置为0有坑

2025年06月18日 Mysql 我要评论
场景:a、b两个数据库有同样的一个t表,从a库t表导出数据、导入到b库t表,导入成功后发现t表中有一条数据和其他表数据关联不上了,通过排查才发现,t表中的id为自增主键,有一条数据的id为0,导入到b

场景:a、b两个数据库有同样的一个t表,从a库t表导出数据、导入到b库t表,导入成功后发现t表中有一条数据和其他表数据关联不上了,通过排查才发现,t表中的id为自增主键,有一条数据的id为0,导入到b库的t表后id不再是0,而是下一个自增值,所以其他表如果是如果该id来和t表关联,那自然是关联不上。

 ps:同一个表里面导出数据后再重新导入也会出现同样的问题。

一、实践一下

创建表:

create table `dept` (
  `id` int(10) unsigned not null auto_increment,
  `name` varchar(32) collate utf8mb4_unicode_ci default null,
  primary key (`id`)
) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci;

添加数据,把其中一条数据id修改为0

导出数据后清除数据再执行sql导入:

insert into `dept` (`id`, `name`) values (0, '数据1');
insert into `dept` (`id`, `name`) values (2, '数据2');

导入后的数据情况:

可以看到,导出后重新导入,id为0的数据变成3了,变成了下一个自增值。

二、原因

在 mysql 中,当表有一个自增主键列(auto_increment)时,如果你尝试插入 id=0 的记录,实际插入的 id 不会保持为 0,而是会使用下一个自增值。
因为默认情况下,mysql 将 id=0 的插入请求视为"未指定值",因此会使用自增序列中的下一个可用值。
这种行为可以通过 sql 模式控制:如果启用了 no_auto_value_on_zero sql 模式,mysql 会允许插入 id=0,默认情况下这个模式是禁用的。

三、解决方案

1. 手动修改数据

不正规。 

2. 临时修改 sql 模式:

set session sql_mode='no_auto_value_on_zero';
insert into your_table (id, ...) values (0, ...);

3. 永久修改 sql 模式(在 my.cnf/my.ini 中)

不推荐:

sql_mode=no_auto_value_on_zero,...其他模式...

注意:不建议在自增主键中插入0值,这可能会导致某些奇奇怪怪的问题。

到此这篇关于mysql自增主键id设置为0有坑的文章就介绍到这了,更多相关mysql自增主键id设置为0内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com