我有下面的sql创建语句

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;

给出以下错误

错误1067 (42000):'create_date'的默认值无效

这里的误差是多少?


当前回答

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

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

在我的情况下,我意识到底层系统将其时区设置为BST而不是UTC,因此在创建表中,默认的'1970-01-01 00:00:01'被强制回1小时,导致无效的时间戳值。

对我来说,我实际上希望机器的时区设置为UTC,这让我解决了问题。当我运行Centos/7时,我只是这么做了

# timedatectl set-timezone UTC

然后重启一切。

其他回答

禁用严格SQL模式

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

在文件中,输入这两行:

[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

默认值应该从1000年开始。

例如,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

希望这能帮助到一些人。

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

' update_date ' TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

我用这个来代替:

' update_date ' TIMESTAMP NOT NULL默认的当前时间戳

只需在数据库SQL文件的顶部定义以下行。

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

这对我很有用。

如果你没有服务器的管理权限,你可以设置当前会话的sql模式:

SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';