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

56次阅读
没有评论

共计 1263 个字符,预计需要花费 4 分钟才能阅读完成。

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计1263字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)