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

rob*_*ert 169 mysql

我有以下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;
Run Code Online (Sandbox Code Playgroud)

给出以下错误

ERROR 1067 (42000): Invalid default value for 'create_date'

这里有什么错误?

Dev*_*art 164

那是因为服务器SQL模式 - NO_ZERO_DATE.

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

  • 我如何给予忽略选项? (16认同)
  • 在MySQL Workbench首选项中,转到标签'Model:MySQL'.将"生成的脚本中使用的SQL_MODE"设置为"STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION",这样可以很好地解决问题. (15认同)
  • 你不能忽视这个选项.这是服务器选项.如果您可以访问my.ini(mysql配置文件),则从sql-mode选项中删除NO_ZERO_DATE并重新启动服务器. (7认同)
  • 要检查此选项 - 运行SHOW VARIABLES LIKE'sql_mode' (6认同)
  • 我使用mysql workbench生成脚本.在脚本中,sql_mode设置为traditional.如果我删除传统,脚本工作. (6认同)
  • 你可以使用命令检查你的sql_mode(注意有两个级别):SELECT @@ GLOBAL.sql_mode; SELECT @@ SESSION.sql_mode; (3认同)

小智 128

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

生成以下行

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
Run Code Online (Sandbox Code Playgroud)

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

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

SET SQL_MODE='ALLOW_INVALID_DATES';
Run Code Online (Sandbox Code Playgroud)

  • 啊,谢谢你.SET SQL_MODE ='ALLOW_INVALID_DATES'; 是一个救生员.当我将wordpress站点迁移到另一台服务器(本地)时,我遇到了这个问题,并且由于此错误,它不会让我导入数据库数据,即使表中没有包含此错误的行. (4认同)
  • 为了让它在 MySQL 8 中工作,我必须添加全局:`SET GLOBAL SQL_MODE ='ALLOW_INVALID_DATES';` (4认同)

小智 45

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)
Run Code Online (Sandbox Code Playgroud)

旁注,如果要插入NULLS:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢使用“column_name TIMESTAMP DEFAULT NOW()”。可能并不适合所有情况,但我想我会分享,因为我也在处理这个问题。 (3认同)
  • 可能是因为"如果没有为表中的第一个TIMESTAMP列设置值,MariaDB会在对相关行执行UPDATE或INSERT查询时自动为其分配当前日期和时间." - [MariaDB Docs](https://mariadb.com/kb/en/library/timestamp/) (2认同)
  • column_name TIMESTAMP DEFAULT '1970-01-01 00:00:01' 为我解决了这个问题。谢谢! (2认同)

Mub*_*bas 35

在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

  • 它确实有帮助,除了`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_SUBSTITUTION (7认同)

Ash*_*ich 14

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

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
Run Code Online (Sandbox Code Playgroud)

它对我有用。


小智 8

使用OS X,根据其编译的默认值从Homebrew,System Variables 安装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".
Run Code Online (Sandbox Code Playgroud)

在这种情况下,一旦您的会话结束或您的更改,它将不会影响.它对其他会话没有影响.

如果您想影响所有客户,请使用"@@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".
Run Code Online (Sandbox Code Playgroud)

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


dgi*_*man 8

通过从Homebrew安装MySQL,我能够在OS X上解决这个问题

brew install mysql
Run Code Online (Sandbox Code Playgroud)

将以下内容添加到/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
Run Code Online (Sandbox Code Playgroud)

并重新启动MySQL

brew tap homebrew/services
brew services restart mysql
Run Code Online (Sandbox Code Playgroud)


pyb*_*pyb 7

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

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

我通过使用此解决:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

  • 我认为这实际上是默认为当前确实有意义的最佳选择,但是对于出生时间戳却没有意义 - 仅作为示例。 (2认同)

Ant*_*yes 6

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

  1. 转到'phpmyadmin'.
  2. 加载phpmyadmin后,单击"变量"选项卡.
  3. 搜索'sql模式'.
  4. 单击"编辑"选项并NO_ZERO_DATE从配置中删除(及其尾随逗号).

这是在wamp或xamp的本地环境中非常常见的问题.