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

这里的误差是多少?


当前回答

改变:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

致以下:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,

其他回答

你可能想检查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模式- NO_ZERO_DATE。

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

如果从MySQL工作台生成脚本。

生成以下一行

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

从SQL_MODE中删除TRADITIONAL,然后脚本就可以正常工作了

否则,您可以将SQL_MODE设置为允许无效日期

SET SQL_MODE='ALLOW_INVALID_DATES';

为了避免这个问题,你需要从mysql模式配置中删除NO_ZERO_DATE。

进入“phpmyadmin”。 加载phpmyadmin后,单击“变量”选项卡。 搜索“sql mode”。 单击Edit选项并从配置中删除NO_ZERO_DATE(及其后面的逗号)。

在使用wamp或xamp的本地环境中,这是一个非常常见的问题。

使用OS X,从Homebrew安装mysql,系统变量基于它的默认编译。 解决方法是将“NO_ZERO_DATE”从系统变量“sql_mode”中删除。

请记住,范围涉及。

如果你只想影响你的会话,请使用“@@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".

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