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


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

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

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

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

我的表最后两列是created_at和updated_at

这是我的表结构

enter image description here


33
2018-04-27 06:37


起源


这些列的默认值是什么?你能分享桌面结构吗? - Priyanshu
@Priyanshu我已经更新了我的表结构 - iamsujit
为最后两列设置默认值current_timestamp。 - Priyanshu


答案:


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

show variables like 'sql_mode' ; 

并删除sql_mode“NO_ZERO_IN_DATE,NO_ZERO_DATE“让它发挥作用。

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


41
2018-06-08 07:43



我知道这一点,但在我的服务器sql_mode显示空白,仍然无法正常工作,我正在使用[服务器版本:5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]。任何人都可以有任何解决方案而无需升级服 - Priyabrata Atha
你有全球指挥检查过吗?同一会话的sql_mode中没有任何内容? - Aman Aggarwal
我检查了显示变量,如'sql_mode';输出是Variable_name | Value = sql_mode | - Priyabrata Atha
那么伙计们,没有办法!好的我要升级服务器。谢谢! - Priyabrata Atha
这对这个答案很有用 stackoverflow.com/questions/2317650/... - Preshan Pradeepa


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

SET sql_mode = '';

36
2017-10-28 10:52





尝试并运行以下命令:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

您收到此错误的原因是您没有为此设置默认值 created_at 和 updated_at 领域。 MySQL不接受您的命令,因为这些列的值不能为空。

希望这可以帮助。


13
2018-04-27 07:07



谢谢,upvoted,我更喜欢我的用例中的这个解决方案 - ChrisR


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

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


7
2018-05-23 09:38





在我的情况下,我有一个文件要导入。 所以我只是添加了SET sql_mode ='';在文件的开头,它的工作原理!


3
2018-01-11 20:17





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

更改:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

至:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

即只是删除周围的引号 CURRENT_TIMESTAMP

希望这有助于某人。


2
2017-11-09 00:19





你可以这样做:

 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;
  • 因为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 []>

1
2018-04-27 07:24