MYSQL timestamp NOT NULL插入NULL的报错问题

时间:2024-01-21 20:15:09

1. 在开发两个数据库数据同步功能的时候,需要在本地搭建一个本地的数据库作为一个本地库,然后用于同步开发库中的数据。在插入的时候出现了一个问题。

问题描述:

    我们每张表中都会存在一个create_time 以及update_time两个字段。该两个字段的定义如下:

  `create_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建日期',
  `update_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',

  其中创建时间采用timestamp类型并且其默认值为CURRENT_TIMESTAMP。

    当我向数据库中插入一条数据的时候,create_time与Update_time设置为null的时候,开发库中会走默认值,但是本地库并不会,并且报错“create_time” cannot be null

问题解决:

查询google后发现

MySql系统变量explicit_defaults_for_timestamp: 该变量的作用为:

查看了一下解释

大概是这么说的:

当你设置为false的时候:

  • 未明确声明为NULL属性的TIMESTAMP列被分配为NOT NULL属性。 (其他数据类型的列,如果未显式声明为NOT NULL,则允许NULL值。)将此列设置为NULL将其设置为当前时间戳。
  • 表中的第一个TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT或ON UPDATE子句)将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
  • 第一个之后的TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT子句)将自动分配DEFAULT'0000-00-00 00:00:00'(“零”时间戳)。 对于不指定此列的显式值的插入行,该列将分配“0000-00-00 00:00:00”,并且不会发生警告。

当你设置为true的时候:

  • 未明确声明为NOT NULL的TIMESTAMP列允许NULL值。 将此列设置为NULL将其设置为NULL,而不是当前时间戳。
  • 没有TIMESTAMP列自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。 必须明确指定这些属性。
  • 声明为NOT NULL且没有显式DEFAULT子句的TIMESTAMP列被视为没有默认值。 对于不为此列指定显式值的插入行,结果取决于SQL模式。 如果启用了严格的SQL模式,则会发生错误。 如果未启用严格的SQL模式,则会为列分配隐式默认值“0000-00-00 00:00:00”,并发出警告。 这类似于MySQL如何处理其他时间类型,如DATETIME。

查看我的本地库,发现我的my.cnf文件上居然加上了一个这么个玩意:

[client]
port=3306
default-character-set=utf8

[mysqld]
#解压目录
basedir=D:\MYSQL\
#解压目录下data目录
datadir=D:\MYSQL\data
port=3306
character_set_server=utf8
#导出mysql数据的目录
secure_file_priv = D:\MYSQL\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#开启查询缓存
explicit_defaults_for_timestamp=true
skip-grant-tables

[WinMySQLAdmin]
D:\MYSQL\mysqld.exe

  

后悔后悔,没有好好看配置啊。直接copy。。。。

 

问题总结:
  1. timestamp如果想设置为not null,则必须要设置默认值。建议设置为当前时间即可

       2. explicit_defaults_for_timestamp 这个参数已经在5.6版本已经弃用了,不建议采用该配置了

       3. 好好看配置文件,不要乱copy