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

时间:2012-02-08 11:01:42

标签: mysql

我有以下sql create statement

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'

这里有什么错误?

17 个答案:

答案 0 :(得分:149)

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

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

答案 1 :(得分:112)

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

生成以下行

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

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

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

SET SQL_MODE='ALLOW_INVALID_DATES';

答案 2 :(得分:40)

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);

答案 3 :(得分:32)

在ubuntu桌面16.04中,我这样做了:

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

  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

答案 4 :(得分:8)

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

请记住,范围涉及。

如果您只想在会话中受到影响,请使用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". ,例如:

plt.plot(gaussian(x, 1, 0))

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

答案 5 :(得分:8)

我能够通过从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

答案 6 :(得分:5)

要避免此问题,您需要从mysql模式配置中删除NO_ZERO_DATE

  1. 转到'phpmyadmin'。
  2. 加载phpmyadmin后,点击“变量”标签。
  3. 搜索'sql mode'。
  4. 单击“编辑”选项,然后从配置中删除NO_ZERO_DATE(及其尾随逗号)。
  5. 在使用wamp或xamp的本地环境中,这是一个非常常见的问题。

答案 7 :(得分:4)

我在MySQL 5.7中遇到了类似的问题,代码如下:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

我通过使用它来修复:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

答案 8 :(得分:1)

禁用严格的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

答案 9 :(得分:1)

更改此:

`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 ,

答案 10 :(得分:1)

Just Define following lines at top of your Database SQL file.

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

It is working for me.

答案 11 :(得分:1)

您可能希望检查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

并重新启动所有内容。

答案 12 :(得分:0)

默认值应从1000年开始。

例如,

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

希望这有助于某人。

答案 13 :(得分:0)

你可以改变这个:

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

对于这样的事情:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',

答案 14 :(得分:0)

您可以更改此设置:

create_date日期时间NOT NULL缺省'0000-00-00 00:00:00',

对于这样的事情:

create_date varchar(80)不是NULL默认值'0000-00-00 00:00:00',

答案 15 :(得分:0)

我尝试将列的类型设置为'timestamp',它对我有用。

答案 16 :(得分:0)

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

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