美文网首页
mysql建表报错

mysql建表报错

作者: 小曾玛利亚 | 来源:发表于2021-04-12 10:41 被阅读0次

    问题描述:
    使用数据库脚本创建表的时候,报这个错:
    Invalid default value for 'create_time'

    而我的对应sql语句时这样的:

    `create_time` timestamp(0) DEFAULT NULL COMMENT '创建时间'
    

    到网上查了资料,有这样一段话

    mysql5.6.6之前,timestamp时间类型有一个默认行为:
    TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)
    insert插入一条数据,TIMESTAMP的列值为NULL,会自动存储时候,会将当前timestamp存储到这个timestamp列中。

    这个描述告诉我们的问题很明白:
    创建timestamp类型的字段时,不允许为空,如果非要为空,需要更改mysql配置,这个关键配置叫做 explicit_defaults_for_timestamp

    我查了一下我的mysql关于这个配置,结果如下:

    mysql> show variables like 'explicit_defaults_for_timestamp';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | explicit_defaults_for_timestamp | OFF   |
    +---------------------------------+-------+
    1 row in set (0.03 sec)
    
    • 如果你不修改mysql语句,那我们把配置修改为explicit_defaults_for_timestamp = ON即可,关于这一块的修改方式,可以通过命令方式
    mysql> set @@global.explicit_defaults_for_timestamp=on; -- 把全局的设置为on 那么新的连接就会被设置成on
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> set @@session.explicit_defaults_for_timestamp=on; -- 把当前连接explicit_defaults_for_timestamp设置为on
    Query OK, 0 rows affected (0.00 sec)
    
    

    但是命令行方式,在重启mysql的情况下会失效,所以建议在msyql的配置文件my.cnf里修改之后重启mysql即可。

    • 不过一般默认为ON的情况下,我们则需要老老实实按照系统的建议,将create_time的默认值配置上即可,这个也是我推荐的方式,因为创建时间和修改时间的字段,按照规范最好配置上默认值,修改后sql语句如下:
    `create_time` timestamp(0) DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` timestamp(0) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
    

    done! 问题解决

    相关文章

      网友评论

          本文标题:mysql建表报错

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