• ADADADADAD

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

    mysql数据库 时间:2024-11-26 22:10:20

    作者:文/会员上传

    简介:

    环境.MySQL 5.6.14SQL_Mode:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION生产环境 配置表,设置主键为自增.一天某同学让我帮忙从测试导一批数据到生产.虽然我对这种方式深恶

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。


    环境.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的记录导致数据混乱该怎么办.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: insert