我有下面的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'的默认值无效

这里的误差是多少?


当前回答

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

NO_ZERO_DATE -在严格模式下,不允许'0000-00-00'作为有效日期。您仍然可以使用IGNORE选项插入零日期。如果不是严格模式,则接受日期,但会生成警告。

其他回答

你可以修改这个:

默认'0000-00-00 00:00:00',

就像这样:

默认值:0 -0 -00-00

我尝试将列的类型设置为“时间戳”,它为我工作。

ALTER TABLE `wp_actionscheduler_actions` CHANGE `scheduled_date_gmt` `scheduled_date_gmt` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `scheduled_date_local` `scheduled_date_local` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `last_attempt_gmt` `last_attempt_gmt` DATETIME NULL DEFAULT CURRENT_TIMESTAMP, CHANGE `last_attempt_local` `last_attempt_local` DATETIME NULL DEFAULT CURRENT_TIMESTAMP; 

我很惊讶看到这么多答案,但没有人指出主要原因:不正确的“零”日期格式。简而言之,只需使用'0000-01-01 00:00:00'而不是'0000-00-00 00:00:00'。月00和日00显然都不是有效值。

我同意顶级用户的意见,这个错误是由MySQL设置NO_ZERO_DATE引起的。这个设置是在新的MySQL服务器版本中引入的,默认启用,这让许多开发人员感到惊讶。但是请注意,这种设置的主要目的并不是让开发人员的工作更困难,而是迫使他们修正过时的表结构,并避免在将来使用这种不正确的数据结构格式。

因此,如果您正在创建新表并希望指定“ZERO”日期,请使用'0000-01-01 00:00:00'。

如果你已经创建了表并得到了这个错误(例如,在插入新记录时忽略了默认值),只需像这样更新你的表:

ALTER TABLE `erp`.`je_menus` 
MODIFY COLUMN `create_date` datetime(0) NOT NULL DEFAULT '0000-01-01 00:00:00'  AFTER `notes`;

删除上述服务器设置只是暂时的解决方案,并不是一个良好实践的例子。

你可能想检查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

然后重启一切。