错误1067(42000):'created_at'的默认值无效

iam*_*jit 64 mysql

当我试图改变表格时显示错误

ERROR 1067 (42000): Invalid default value for 'created_at'
Run Code Online (Sandbox Code Playgroud)

我谷歌这个错误,但我发现只是他们试图改变时间戳这个错误发生但在这里我试图添加新列,我收到此错误

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'
Run Code Online (Sandbox Code Playgroud)

我的表有最后两列是created_at和updated_at

这是我的表结构

在此输入图像描述

Ama*_*wal 87

问题是因为sql_modes.请通过命令检查当前的sql_modes:

show variables like 'sql_mode' ; 
Run Code Online (Sandbox Code Playgroud)

并删除sql_mode" NO_ZERO_IN_DATE,NO_ZERO_DATE "以使其工作.

这是mysql新版本中的默认sql_mode.

  • 我知道这一点,但在我的服务器sql_mode显示空白,仍然无法正常工作,我正在使用[服务器版本:5.5.53-0ubuntu0.12.04.1 - (Ubuntu)].任何人都可以在没有升级服务器版本的情 (5认同)
  • 5.7 对我不起作用。不确定我是否必须在全球范围内这样做。 (4认同)
  • 这对这个答案很有用/sf/ask/162235531/ (2认同)

Ahm*_*med 74

简单地说,在运行任何语句之前,请将其放在第一行:

SET sql_mode = '';
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的提示。但是仅删除日期限制`NO_ZERO_IN_DATE,NO_ZERO_DATE`仅允许我们维护其他安全功能:`SET sql_mode ='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' (5认同)
  • 需要澄清的是,该语句只能在开发中使用,而不能在生产中使用。 (2认同)

Mar*_*han 21

我在尝试安装第三方数据库时遇到了同样的错误.我尝试了解决方案提出失败,即
SET sql_mode = '';

然后我尝试了下面的命令,它允许安装数据库
SET GLOBAL sql_mode = '';

  • `SET sql_mode = '';` 现在已弃用,`SET GLOBAL sql_mode = ''` 是可以的 (2认同)

Mic*_*rla 20

尝试并运行以下命令:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;
Run Code Online (Sandbox Code Playgroud)

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;
Run Code Online (Sandbox Code Playgroud)

您收到此错误的原因是您没有为created_atupdated_at字段设置默认值.MySQL不接受您的命令,因为这些列的值不能为空.

希望这可以帮助.

  • 谢谢,upvoted,我更喜欢我的用例中的这个解决方案 (2认同)
  • 这应该是公认的答案。许多其他答案都是解决该错误的解决方法。在现代MySQL中,最好将默认值设置为有效值。 (2认同)

小智 7

就我而言,我有一个要导入的文件。
所以我只是SET sql_mode = '';在文件的开头添加了它并且它有效!


Bhu*_*han 6

我有类似的问题。以下解决了它:

改变:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

到:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

即只需删除CURRENT_TIMESTAMP周围的引号。

希望这可以帮助某人。


小智 6

运行此查询:

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

这个对我有用


mal*_*isi 6

对于Mysql5.7,登录mysql命令行并运行命令,

mysql> show variables like 'sql_mode' ;
Run Code Online (Sandbox Code Playgroud)

它将在 sql_mode 中显示 NO_ZERO_IN_DATE、NO_ZERO_DATE。

在此输入图像描述

尝试在 mysql conf 文件中的 [mysqld] 下面添加一行以删除这两个选项,我的(Ubuntu 16 上的 mysql 5.7)是 /etc/mysql/mysql.conf.d/mysqld.cnf

在此输入图像描述

现在重新启动mysql。有用!


Ber*_*fen 5

你可以这样做:

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
  • 由于 TIMESTAMP 值存储为 Epoch Seconds,因此时间戳值“1970-01-01 00:00:00”(UTC) 被保留,因为第二个 #0 用于表示“0000-00-00 00:00:00” '。
  • 在 MariaDB 5.5 及之前版本中,每个表只能有一个 TIMESTAMP 列,并将 CURRENT_TIMESTAMP 定义为其默认值。自 MariaDB 10.0 起,此限制不再适用。

请参阅: https: //mariadb.com/kb/en/mariadb/timestamp/

样本

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>
Run Code Online (Sandbox Code Playgroud)