2016-04-27 35 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"; 

它的工作原理對我來說