场景: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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论