美文网首页
Mysql 5.6.30 insert null (ERROR

Mysql 5.6.30 insert null (ERROR

作者: saife | 来源:发表于2016-08-05 16:45 被阅读290次

    问题

    对定义了ctime为not null的表,insert ctime null 在开发环境可以通过,但是部署上线出问题了,提示
    ERROR 1048 (23000): Column ‘ctime’ cannot be null

    分析

    Dev env: MySQL 5.6.30
    Online env: Mysql 5.7.10

    • 对比表结构
    • 对比执行sql
    • 考虑可配置参数

    解决方案

    1. 表结构一样

    2. 查看关于insert syntax的文档
      http://dev.mysql.com/doc/refman/5.7/en/insert.html (doc version 5.7) 定义 not null 的字段,insert null 分两种情况:
      单行会报错,1048错误;
      多行会忽略,如果是时间字段,会插入 ‘0000-00-00 00:00:00’

    3. 按照
      https://mariadb.com/kb/en/mariadb/null-values/
      的解释 对于 AUTO_INCREMENT, TIMESTAMP and virtual columns类型字段,insert null会特殊处理,其他的情况符合2的说明。

    4. 可以影响提示的参数是sql_mod
      http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html 可以查看SQL Mode Changes in MySQL 5.7部分,但也没有明确说明。

    5. 开发环境是Mysql 5.6.30; 线上环境是Mysql 5.7.11 考虑到版本问题对Mysql
      5.6.27 / Mysql 5.7.10 / Mysql 5.6.24 进行测试,与线上环境的情况一致。

    结论

    综上,结合4,5可以判断为,在定义了not null的字段,只有5.6.30 insert null会通过,属于特别情况。 属于版本问题,建议你如果需要insert null,就不要定义为not null!

    测试脚本

    DROP TABLE IF EXISTS test;
    CREATE TABLE `test` (
      `id` BIGINT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
      `number` VARCHAR(20) NOT NULL,
      `status` TINYINT(1) NOT NULL DEFAULT '1',
      `ctime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      `utime` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`),
      UNIQUE KEY `idx_number_UNIQUE` (`number`)
    ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='白名单';
    
    SELECT * FROM test;
    INSERT INTO test(`status`) VALUE(1);
    SELECT * FROM test;
    INSERT INTO test(number,`status`,ctime) VALUE(2,2,NULL);
    SELECT * FROM test;
    

    相关文章

      网友评论

          本文标题:Mysql 5.6.30 insert null (ERROR

          本文链接:https://www.haomeiwen.com/subject/wpohsttx.html