“create_date”时间戳字段的默认值无效

我有以下的SQL创build语句

mysql> CREATE TABLE IF NOT EXISTS `erp`.`je_menus` ( -> `id` INT(11) NOT NULL AUTO_INCREMENT , -> `name` VARCHAR(100) NOT NULL , -> `description` VARCHAR(255) NOT NULL , -> `live_start_date` DATETIME NULL DEFAULT NULL , -> `live_end_date` DATETIME NULL DEFAULT NULL , -> `notes` VARCHAR(255) NULL , -> `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', -> `created_by` INT(11) NOT NULL , -> `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , -> `updated_by` INT(11) NOT NULL , -> `status` VARCHAR(45) NOT NULL , -> PRIMARY KEY (`id`) ) -> ENGINE = InnoDB; 

给出以下错误

ERROR 1067 (42000): Invalid default value for 'create_date'

这里有什么错误?

这是因为服务器SQL模式 – NO_ZERO_DATE 。

从参考: NO_ZERO_DATE – 在严格模式下,不要将'0000-00-00'作为有效date。 您仍然可以使用IGNORE选项插入零date。 不在严格模式时,date被接受,但会产生警告。

如果您从MySQL工作台生成脚本。 生成以下行SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 从SQL_MODE中移除TRADITIONAL,然后脚本应该正常工作

否则,可以将SQL_MODE设置为允许无效dateSET SQL_MODE='ALLOW_INVALID_DATES';

TIMESTAMP的范围为'1970-01-01 00:00:01'UTC到'2038-01-19 03:14:07'UTC(见doc )。 默认值必须在该范围内。

其他奇怪的,相关的行为:

 CREATE TABLE tbl1 ( ts TIMESTAMP); Query OK, 0 rows affected (0.01 sec) CREATE TABLE tbl2 ( ts TIMESTAMP, ts2 TIMESTAMP); ERROR 1067 (42000): Invalid default value for 'ts2' CREATE TABLE tbl3 ( ts TIMESTAMP, ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01'); Query OK, 0 rows affected (0.01 sec) 

注意,如果你想插入NULLS:

 CREATE TABLE tbl4 ( ts TIMESTAMP NULL DEFAULT NULL); 

在Ubuntu桌面16.04,我做到了这一点:

  1. 打开文件: /etc/mysql/mysql.conf.d/mysqld.cnf在您select的编辑器中。

  2. 查找: sql_mode ,它将在[mysqld]下的某处。

  3. 并将sql_mode设置为以下内容:

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. 保存并重新启动mysql服务,方法是:

    sudo service mysql restart

希望这有助于某人。

使用OS X ,根据其编译的默认值从Homebrew ,System Variables安装mysql。 解决方法是从系统variables“sql_mode”中删除“NO_ZERO_DATE”。

请记住,范围涉及。

如果您只想在会话中使用,请使用"@@session" ,例如:

 SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION". 

在这种情况下,一旦您的会话结束或您改变它,它不会影响。 这对其他会话没有影响。

如果您想影响所有客户,请使用"@@global" ,例如:

 SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION". 

在这种情况下,它只影响更改后连接的客户端(不会影响当前所有客户端),并且在服务器退出后不起作用。

我能够通过从Homebrew安装MySQL来解决OS X上的这个问题

 brew install mysql 

通过将以下内容添加到/usr/local/etc/my.cnf

 sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

并重新启动MySQL

 brew tap homebrew/services brew services restart mysql 

在一个版本为5.1.73的服务器上,我不得不使用'1970-01-02 00:00:01'而不是'1970-01-02 00:00:01'

另一方面, '1970-01-02 00:00:01'工作正常!

两者都没有为sql_modevariables的值。

您可能想要检查MySql实例上的时区设置:

 mysql> show variables like 'time_zone'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | time_zone | SYSTEM | +---------------+--------+ 

在我的情况下,我意识到底层系统的时区设置为BST而不是UTC,所以在创build表中默认的“1970-01-01 00:00:01”被强制返回1小时,导致一个无效的时间戳值。

对于我来说,我真的希望机器的时区设置为UTC,并将我排除在外。 当我运行Centos / 7时,我只是做了

 # timedatectl set-timezone UTC 

并重新启动一切。

请goto你的phpmyadminselect数据库selectperformance在goto表结构,你可以在这里看到默认列current_timestamp现在改变的默认值点击列“行动” – >表列 – >在默认列更改select无我认为你的问题是解决 在这里输入图像说明

我有一个类似的问题与MySQL 5.7与以下代码:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

我修改了这个,而不是:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

禁用严格的SQL模式

 Create disable_strict_mode.cnf file at /etc/mysql/conf.d/ 

在文件中,input这两行:

 [mysqld] sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 

最后,用这个命令重新启动MySQL:

 sudo service mysql restart