2014-02-20 105 views
14

我想要澄清一下MySQL 5.5中默認值的行爲& 5.6。比方說,我們有一個MySQL 5.5服務器上的如下表:MySQL 5.5和5.6默認值

CREATE TABLE `test` (
`TestColumn` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP 
) ENGINE=INNODB DEFAULT CHARSET=utf8; 

我能沒有問題,運行下面的查詢:

INSERT INTO `test` VALUES (NULL); 

它創建以下行:

TestColumn 
2014-02-20 14:55:05 

現在,如果我在MySQL 5.6服務器上重複相同的測試,插入失敗:

Error Code: 1048 
Column 'TestColumn' cannot be null 

我知道5.6(http://dev.mysql.com/doc/refman/5.6/en/timestamp-initialization.html)中的時間戳自動初始化發生了變化,但我無法解決的是如何複製5.6中5.5中看到的行爲。

不確定它是否重要,但我們的5.6服務器將explicit_defaults_for_timestamp設置爲ON。

理想情況下,我所追求的是解決方案,但如果任何人有更好的理解,並且可以解釋它,那也是有用的。

謝謝。

編輯:我們正在使用MySQL 5.6.13

+1

第一次插入不應該在第一個地方工作。你要求數據庫將NULL值放入非空列,所以5.6拒絕這一點。 –

+0

這適用於5.6 – bear

+0

@a_horse_with_no_name定義是該列不能爲空 - 但是,如果提供了默認值,它將使用默認值。編輯,從頭開始 – bear

回答

12

上面在5.5中顯示的行爲實際上是一個錯誤。這在5.6.11中得到了修復。檢查底部的release notes for 5.6.11。這是bug 68472和16394472(我實際上找不到鏈接)的一部分。

如果關閉explicit_defaults_for_timestamp標誌了,它應該工作,因爲它在5.5

做這是我必須與我們的數據庫,當我們更新從5.5到5.6的確切同樣的問題。

+0

這個工作的原因有點複雜。你的查詢在5.5中工作,因爲有一個錯誤,當你真的不應該這樣做時,它允許你將列設置爲NULL。 5.6推出時,他們設置了'explicit_defaults_for_timestamp'標誌,以允許在此期間不推薦使用的功能。但是,在5.6.11中,他們修復了您的(和我的)查詢所依賴的錯誤。幸運的是,對於我們來說,關閉該標誌的NEW默認行爲正是我們想要的行爲。 – Boerema

+0

+1只是爲我們修復了一個阻斷器。非常感謝! – Gray

0

您是否嘗試省略列?

INSERT INTO `test`() VALUES(); 
+0

Hi Rob,這對我的工作很有用但在生產中我們使用Hibernate作爲我們的ORM,所以我們希望能夠在很多情況下針對列設置NULL,無論如何。 – BombTodley

+0

並讓它導致動態時間戳默認值而不是實際的空值? HM。不知道這是可能的。做「設置explicit_defaults_for_timestamp關閉」使這發生? –

+0

它的確如此 - 正如我在上面的評論中所說的,它對我來說仍然沒有意義,但它起作用! – BombTodley