Insert为0的记录导致数据混乱该怎么办

网友投稿 134 2023-12-25

Insert为0的记录导致数据混乱该怎么办

Insert为0的记录导致数据混乱该怎么办,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法

环境.MySQL 5.6.14

SQL_Mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

生产环境 配置表,设置主键为自增.

一天某同学让我帮忙从测试导一批数据到生产.

虽然我对这种方式深恶痛绝,但是没有办法..也只能照做.

导入之后的第二天,业务发现很多生产数据错乱了。

这个礼物的配置表,主键原本设计成自增主键.

但是后来他们用0表示一种特殊礼物...坑就在这里了。

过程模拟

drop table if exists config_gift;

create table config_gift(

GiftID int not null primary key auto_increment,

    GiftName varchar(32) not null

) auto_increment=50000;

insert into config_gift(GiftName) select 鲜花;

insert into config_gift(GiftName) select 鞭炮;

insert into config_gift(GiftName) select 福袋;

select * from config_gift;

当时的SQL_Mode是:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

如果这时执行如下的语句,

insert into config_gift select 0,蛋糕;

insert into config_gift select null,香水;

查看结果竟然如下:

MySQL 如果已经设置了主键自动增长,但是后来却 插入 0 或者 null 作为主键值的话, MySQL会用自增长的值,取代原本的 0 或者 null 。

业务代码中写死了 0 这个礼物ID的判断,所以导致了大量数据错乱,花了很长时间修正.

这种事情猝不及防

业务方定的这个特殊礼物就用0表示,而且也没有人来通知数据库...

数据上线的时候,都是一批数据,人力甄别数据似乎也不现实.

改SQL_mode保平安吧.

在自增主键下,处理主键为0的数据

set @@session.sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero

修改Global和Session级别的SQL_mode之后,主键为0的礼物可以正确插入了。

主要注意的是,即使在这个SQL_mode下(STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,no_auto_value_on_zero)

自增主键,Insert主键为null的数据,还是会使用自增主键的值作为主键,而不是报错。

关于Insert为0的记录导致数据混乱该怎么办问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:mysql如何通过迁移某个库的目录来扩容
下一篇:MySQL 5.7中如何动态修改innodb_buffer_pool大小
相关文章

 发表评论

暂时没有评论,来抢沙发吧~