zoukankan      html  css  js  c++  java
  • MYSQL timestamp NOT NULL插入NULL的报错问题

    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:MYSQLdata
    port=3306
    character_set_server=utf8
    #导出mysql数据的目录
    secure_file_priv = D:MYSQLdata
    sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
    #开启查询缓存
    explicit_defaults_for_timestamp=true
    skip-grant-tables
    
    [WinMySQLAdmin]
    D:MYSQLmysqld.exe
    

      

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

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

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

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

  • 相关阅读:
    js 遇到问题
    table 排序 添加 删除 等操作
    json对象
    .style, .getComputedStyle(),.currentStyle区别
    3个div 宽度移入移出时变化
    运动 js
    OWASP Top 10之文件上传漏洞简析(二)
    owasp top10 之文件上传漏洞简析
    前台实现ajax 需注意的地方
    apache-Rewrite重写规则配置
  • 原文地址:https://www.cnblogs.com/lonecloud/p/9732396.html
Copyright © 2011-2022 走看看