2016-04-27 158 views
20

,当我试图改变表的示值误差ERROR 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

这里是我的表structur Ë

enter image description here

+0

这些列的默认值是什么? 你可以请分享表结构吗? – Priyanshu

+0

@Priyanshu我已经更新了我的表结构 – iamsujit

+0

设置了最后两列的默认值current_timestamp。 – Priyanshu

回答

24

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

show variables like 'sql_mode' ; 

,并删除了的sql_mode “NO_ZERO_IN_DATE,NO_ZERO_DATE”,使其工作。

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

+2

我知道这一点,但在我的服务器sql_mode显示空白,仍然无法正常工作,我正在使用[服务器版本:5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]。任何人都可以有没有升级服务器版本的解决方案? –

+0

你有全局命令检查吗? 和sql_mode中没有相同的会话? –

+0

我检查了显示变量像'sql_mode';并且输出是Variable_name | Value = sql_mode | –

5

尝试运行以下命令:

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_atupdated_at字段。 MySQL不接受你的命令,因为这些列的值不能为空。

希望这会有所帮助。

1

你可以这样说:

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; 
  • 因为时间戳值存储为新纪元的秒数​​,时间戳值“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 []> 
23

简单地说,之前运行的任何陈述把这个第一行:

SET sql_mode = ''; 
2

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

变化:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

到:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

即只是删除引号CURRENT_TIMESTAMP

希望这可以帮助别人。

3

在我的情况下,我有一个文件来导入。 所以我简单地添加了SET sql_mode ='';在文件的开始,它的工作原理!

1

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

然后我尝试下面这些命令奋力允许数据库被安装
SET GLOBAL sql_mode = '';

0

运行此查询:

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

它的工作原理对我来说

相关问题