2013-12-20 22 views
2

我很少用負數工作(除個人理財),或許這就是爲什麼有在我這裏的知識差距...意外行爲INT NOT NULL DEFAULT -1

考慮以下,通過向響應提示由SO中的另一個用戶提問(How to achieve default value if column value is NULL?):

-- Mysql Version 5.5.16 
-- sql_mode = '' 

DROP TABLE prices; 

CREATE TABLE prices (price_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,price INT SIGNED NOT NULL DEFAULT -1); 

INSERT INTO prices (price) VALUES (' '),(''),(NULL); 
INSERT INTO prices (price_id) VALUES (NULL); 

SELECT * FROM prices; 

Expected output: 
+----------+-------+ 
| price_id | price | 
+----------+-------+ 
|  1 | -1 | 
|  2 | -1 | 
|  3 | -1 | 
|  4 | -1 | 
+----------+-------+ 

Actual output: 
+----------+-------+ 
| price_id | price | 
+----------+-------+ 
|  1 |  0 | 
|  2 |  0 | 
|  3 |  0 | 
|  4 | -1 | 
+----------+-------+ 

爲什麼?

中級答案:簡單地說,看來,如果你想確定插入的默認值(當的sql_mode未設置),要麼忽略從INSERT 列顯式添加默認值,即:INSERT INTO prices (price) VALUES(DEFAULT);對我來說,這違背了默認值的精神!?!?

+0

你測試過哪個版本?無法使用http://sqlfiddle.com進行驗證,無論是5.5還是5.6。您的第一個插入語句對所有3個值都失敗。 – fancyPants

+0

5.5.16,sql_mode ='',不是strict_all_tables。這不符合我對該手冊的解釋(http://dev.mysql.com/doc/refman/5.5/en/constraint-invalid-data.html) – Strawberry

+0

所以阿齊茲和阿爾夫布拉沃,你們都對此表示滿意IS預期的行爲? – Strawberry

回答

1

好像:

a)如果你提供了一個NULL值,以一個不空數字字段(不自動遞增),默認值是零。

灣)如果你不提供一個值(在最後一排),您使用給定的默認值(-1)

http://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html

+0

我讀過那個頁面。雖然它表明5.0.2之前的表現與我所期望的完全相同,但我不認爲在這個具體的觀點上(5.0.2後)是明確的,除了推論。我錯過了什麼嗎? – Strawberry

+0

事實上,文檔中存在一個小差距,這個特殊情況沒有解釋。另外,同意阿齊茲 – Alfabravo

1

如果使用Mysql STRICT MODE那麼結果可能會有所不同。

當前您提供的值爲NULL,服務器會嘗試將此值映射到最接近的INT值。服務器未使用默認值-1,因爲它將NULL作爲有效值。