2017-10-09 49 views
0

對此,可能有一個簡單而直接的答案,但我對發生的事情略有困惑。Mysql - 將空值複製到非空表中

我有一列兩個基本表的每個具有該表中列的以下性質

CREATE TABLE test (correct_time timestamp NULL DEFAULT NULL) 
CREATE TABLE test2 (correct_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) 

我然後插入一個NULL值插入test

INSERT INTO test (correct_time) VALUES (NULL) 

現在我嘗試和將test中的所有條目複製到test2

INSERT INTO test2 SELECT * FROM test 

這產生的結果爲test2,其中現在的值是0000-00-00 00:00:00

我的第一個問題就是,test2默認值是CURRENT_TIMESTAMP,那麼爲什麼null值給出的0000-00-00 00:00:00一個值,而不是最近的時間?

此外,這產生了一個警告,column 'correct_time' cannot be null。所以如果我們插入一個NULL值,爲什麼它被設置爲0000-00-00 00:00:00而不是拋出一個錯誤。

+0

這可能取決於你在MySQL 設置'explicit_defaults_for_timestamp'系統變量https://dev.mysql.com/doc/refman/5.7/en /服務器系統變量。html#sysvar_explicit_defaults_for_timestamp –

+0

此外,你需要驗證你的MySQL是否處於'strict'模式 - 這可能會影響它如何處理'null',因爲某些設置會將'null'轉換爲空字符串,因此' 000-00-00 00:00:00' https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html#sql-mode-strict –

+0

謝謝,這就是我曾經尋找。此變量已啓用,但是一旦我禁用它,數據類型時間戳的行爲就會發生變化。 –

回答

0

我的第一個問題就是,test2默認值是CURRENT_TIMESTAMP,那麼爲什麼null值給出的0000-00-00 00:00:00一個值,而不是最近的時間?

這是因爲,當沒有值插入到該列中時使用默認值。在這裏它從test.correct_time中選擇null的值,並嘗試插入test2.correct_time

此外,這產生了一個警告,column 'correct_time' cannot be null。所以如果我們插入一個NULL值,爲什麼它被設置爲0000-00-00 00:00:00而不是拋出一個錯誤。

警告是因爲插入的數據類型與列的類型不匹配。這也是該值設爲0000-00-00 00:00:00的原因。

要理解這一點,試試這個:

INSERT INTO test2 VALUES() 

這應存儲的默認值。

我假設你在表格中有更多的列。你可以像這樣運行查詢兩次:

INSERT INTO test2 (SELECT * FROM test WHERE correct_time IS NOT NULL) 
INSERT INTO test2 (SELECT column1, column2 FROM test WHERE correct_time IS NULL) -- select all columns except correct_time 
+0

據我所知,它試圖進入列的無效類型,但是當我嘗試直接插入空的條目到test2,即插入到test2值(NULL),它會引發錯誤。我知道它會拋出一個錯誤,因爲我們指定不插入空值,但它沒有理解爲無效類型,因此應插入爲「0000-00-00 00:00:00」,而不是引發錯誤? –