【问题标题】:Invalid default value for 'updated_at' in mysqlmysql 中“updated_at”的默认值无效
【发布时间】:2016-12-10 04:56:18
【问题描述】:

原因:java.sql.SQLException:默认值无效 'updated_at' 查询:

CREATE TABLE IF NOT EXISTS saved_query (id int(11)
NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,description
 varchar(255) DEFAULT NULL,query longtext,params_json
longtext,created_at timestamp DEFAULT CURRENT_TIMESTAMP,updated_at
=timestamp NOT NULL,  PRIMARY KEY (id)) Parameters: []

粘贴查询以提高可读性:

CREATE TABLE IF NOT EXISTS saved_query 
( 
 id          INT(11) NOT NULL auto_increment, 
 name        VARCHAR(255) NOT NULL, 
 description VARCHAR(255) DEFAULT NULL, 
 query       LONGTEXT, 
 params_json LONGTEXT, 
 created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
 updated_at  TIMESTAMP NOT NULL, 
 PRIMARY KEY (id) 
) 

Mysql 版本为5.7.13。上面的查询适用于版本5.65.5。以下查询适用于5.7,但不适用于<5.7 版本:

CREATE TABLE IF NOT EXISTS saved_query 
  ( 
     id          INT(11) NOT NULL auto_increment, 
     name        VARCHAR(255) NOT NULL, 
     description VARCHAR(255) DEFAULT NULL, 
     query       LONGTEXT, 
     params_json LONGTEXT, 
     created_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
     updated_at  TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
     PRIMARY KEY (id) 
  ) 

5.6 中的错误是:

原因:java.sql.SQLException:不正确的表定义;那里 只能是一个 TIMESTAMP 列,其中 CURRENT_TIMESTAMP 为 DEFAULT 或 ON UPDATE子句查询:

 CREATE TABLE IF NOT EXISTS saved_query (id
 int(11) NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,description
 varchar(255) DEFAULT NULL,query longtext,params_json
 longtext,created_at timestamp DEFAULT CURRENT_TIMESTAMP,updated_at
 timestamp DEFAULT CURRENT_TIMESTAMP,  PRIMARY KEY (id)) Parameters: []

适用于所有这些版本的查询应该是什么?

【问题讨论】:

  • 这和java有什么关系?
  • 将 created_at 更改为只是 TIMESTAMP 并将其填充到第一条记录 INSERT 中。事后看来是合乎逻辑的吗?

标签: java mysql database timestamp


【解决方案1】:

问题是因为 sql_modes。您必须删除 sql_mode 才能使其工作。移除这些 SQL 模式

NO_ZERO_IN_DATE
NO_ZERO_DATE

在运行任何查询之前,将此代码粘贴到代码的第一行:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

在运行任何查询之前,将此代码粘贴到第一行:

SET sql_mode = '';

【讨论】:

    【解决方案2】:

    TIMESTAMP不能为NULL,mysql为列添加DEFAULT CURRENT_TIMESTAMP。但可能只有一列宽DEFAULT CURRENT_TIMESTAMP。只需使用'0000-00-00 00:00:00'

    CREATE TABLE IF NOT EXISTS saved_query 
      ( 
         id          INT(11) NOT NULL auto_increment, 
         name        VARCHAR(255) NOT NULL, 
         description VARCHAR(255) DEFAULT NULL, 
         query       LONGTEXT, 
         params_json LONGTEXT,
         created_at  TIMESTAMP DEFAULT '0000-00-00 00:00:00',
         updated_at  TIMESTAMP DEFAULT '0000-00-00 00:00:00',
         PRIMARY KEY (id) 
      )
    

    【讨论】:

    • 不起作用。错误:Error: Invalid default value for 'created_at' SQLState: 42000 ErrorCode: 1067
    猜你喜欢
    • 2019-02-28
    • 2017-06-06
    • 2018-07-06
    • 1970-01-01
    • 2019-06-15
    • 2015-09-11
    • 1970-01-01
    • 2021-08-17
    • 2018-01-05
    相关资源
    最近更新 更多