MySQL-使用自增ID无法插入ID为0值的记录问题分析

MySQL-使用自增ID无法插入ID为0值的记录的问题分析

记录一次数据库备份还原过程中的问题,以便今后遇到该问题能迅速定位。

问题产生的背景
1、数据库中表使用的是自增ID
2、在项目开发过程中数据库分为开发库和生产库,由于业务逻辑的需要,在生产库中把其中一个表的一条记录的ID手动改成了0。
3、备份生产库导入开发库过程中

问题
1、项目运行后,发现数据出现了严重的偏差,一些关联查询的数据不对,一开始以为是备份数据库或者导入数据库过程中出现了问题,来来回回折腾了几次,问题依旧。
2、追寻出问题的数据,查询数据库,发现ID手动改为0的那条记录被插入到最后一条记录,当然ID也不是0了。查看备份的源文件,生成的insert语句中这条记录的ID确实是0。难道产生了幻觉。

原因分析
1、因为在数据库表中ID采用了自增ID策略。默认情况下当ID是0或者null的时候,数据库会自动产生一个新的自增序列作为这条记录的ID。这就是我们插入0值ID记录时与期望不符原因。

看一下官方解释以及解决方案
1、最权威的还是官网解释
https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_auto_value_on_zero
MySQL-使用自增ID无法插入ID为0值的记录问题分析2、大体意思就是说默认情况下,自增列插入null或者0的时候数据库会产生一个新的自增数值。如果想让自增列在只插入null的时候产生自增序列。就要提前设置mysql的sql_mode包括NO_AUTO_VALUE_ON_ZERO。
3、如果要还原的数据库中有很多自增列为0值的数据,那么就设置一下sql_mode把,在my.ini或者my.cnf中设置sql_mode
4、在设置sql_mode之前需要查询数据库原来拥有那些设置了的mode
SELECT @@sql_mode
MySQL-使用自增ID无法插入ID为0值的记录问题分析5、在配置文件中加入
sql_mode = “STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_AUTO_VALUE_ON_ZERO”
MySQL-使用自增ID无法插入ID为0值的记录问题分析
6、重启数据库,这时候插入0值自增列数据就不会有问题了。

如果导入的数据中只有一条或或者几条数据,其实不必大费周章,导入后手动改一改也是可以的。
但是不管怎么样,我们要知其然,更要知其所以然。

小尾巴~~
只要有积累,就会有进步