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


186

我有以下sql create语句

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'

这是什么错误?


我看不到您的查询有任何问题,它可以在刚刚测试的5.1.50社区上运行。
Jaspreet Chahal

最后我也可以查询。
Shakti Singh'2

不确定,但是给该字段取一个不同的名称并尝试吗?
Naveen Kumar '02

我在ubuntu 10.04中使用mysql 5.1.56社区。并且无法正常工作
罗伯特2012年

5
无零日期需要一个日期。使用“ 1970-01-01 00:00:01”。[从此处获取] [1] [1]:dba.stackexchange.com/questions/6171/…–
Jadeye

Answers:


176

那是由于服务器SQL模式-NO_ZERO_DATE

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


19
我如何给忽略选项?
罗伯特2012年

9
您不能忽略此选项。这是服务器选项。如果您有权访问my.ini(mysql配置文件),则从sql-mode选项中删除NO_ZERO_DATE并重新启动服务器。
Devart

7
要检查此选项,请运行SHOW VARIABLES LIKE'sql_mode'–
Devart,

6
我使用mysql工作台生成了脚本。在脚本中,sql_mode设置为繁体。如果我删除了传统脚本,该脚本将起作用。
罗伯特2012年

17
在“ MySQL Workbench”首选项中,转到“模型:MySQL”选项卡。将“在生成的脚本中使用的SQL_MODE”设置为“ STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”,这将彻底解决该问题。
sgtdck

140

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

产生以下行

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

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

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

SET SQL_MODE='ALLOW_INVALID_DATES';

1
节省了我一些时间寻找为什么它不起作用:)
Srneczek 2015年

5
啊,谢谢。SET SQL_MODE ='ALLOW_INVALID_DATES'; 是救生员。尝试将wordpress网站迁移到另一台服务器(均为本地服务器)时遇到了这个问题,即使该表中没有行出现此错误,它也不会由于此错误而导致我导入数据库数据。
mikato '16

像魅力一样工作!谢谢。
moreirapontocom

52

TIMESTAMP的UTC范围是'1970-01-01 00:00:01'至'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)

旁注,如果要插入NULL:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

1
这发生在我身上。到底是怎么回事?ts2甚至不是“ NOT NULL” ...!
PedroD

2
可能是因为“如果您没有为表中的第一TIMESTAMP列设置值,则在所涉及的行上执行UPDATE或INSERT查询时,MariaDB将自动为它分配当前日期和时间。” – MariaDB文件
jsphpl '18年

1
我喜欢使用column_name TIMESTAMP DEFAULT NOW()。可能并不适合每种情况,但自从我也处理过这件事以来,我就想分享一下。
DeezCashews

1
column_name TIMESTAMP DEFAULT'1970-01-01 00:00:01'对我有用。谢谢!
metafa

41

在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


8
它确实有所帮助,只是sql_mode在ubuntu16.04上的mySQL实例不存在该实例。我必须通过删除“ NO_ZERO_DATE”在文件中添加一个条目。因此,现在的样子如下:#添加以下行以摆脱no_zero_date sql_mode = ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTIT16
OK999

您是对的。.我之前添加了此选项以禁用严格模式..当我针对此特定问题对其进行编辑时,该sql_mode条目已经存在。
Mubashar Abbas

这是一个错误吗?CURRENT_TIMESTAMP永远不要返回“ 0000-00-00 00:00:00”,否则我错了?为什么我必须更改mysqld设置?
letjump

@letsjump,因为有人错误地配置了您的mysql服务器。我用导入的数据库遇到了这个问题。列中时间戳的默认值不是有效的时间戳值。REAL解决方案是将默认时间戳更新为有效的日期,例如1970-最早的可用日期。临时解决方法是禁用对数据库的检查。
anon58192932 '18

9

使用OS XHomebrew安装mysql ,根据其内置默认值安装系统变量。解决方案是从系统变量“ 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".

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


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

7

我在MySQL 5.7中使用以下代码遇到了类似的问题:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

我通过使用此解决:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP


2
我认为这实际上是最好的选择,因为默认情况下默认为current确实可行,但是对于出生时间戳而言却没有任何意义-仅作为示例。
喵喵'18

7

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

  1. 转到“ phpmyadmin”。
  2. 加载phpmyadmin后,单击“变量”选项卡。
  3. 搜索“ SQL模式”。
  4. 单击“编辑”选项,NO_ZERO_DATE然后从配置中删除(及其尾部逗号)。

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



2

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

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

然后重新启动一切。


1

默认值应从1000年开始。

例如,

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

希望这对某人有帮助。


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 ,

1
点评来源:您好,请不要仅提供源代码。尝试提供有关您的解决方案如何工作的很好的描述。请参阅:我如何写一个好的答案?。谢谢
sɐunıɔןɐqɐp

如果这是WordPress网站,请不要更新Core WordPress表格。许多插件期望zeores的值,因此WordPress不能因为会破坏插件的传统原因而更改此默认值。Wordpress线程Wordpress支持。在不熟悉代码的情况下依靠默认值更改数据库结构可能会导致错误。尽管这在许多情况下可以作为解决方案,但在其他情况下却可能会破坏环境。不是通用解决方案。
SherylHohman

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.