2013-05-21 41 views
9

我已經acreated包含INT類型的列的表:如何在FLOAT值插入MySQL中的INT列時發出警告?

CREATE TEMPORARY TABLE `myTab` (`int` INT, `text` TEXT, `float` FLOAT); 

現在,我嘗試爲浮點值添加到INT列

INSERT INTO `myTab` (`int`) VALUES (13.34); 

我沒有得到一個警告:

SHOW WARNINGS; 

雖然列中只包含13算賬:

SELECT * FROM `myTab`; 

是它在某種程度上可以當一個浮點值被添加到一個整數列,得到一個警告?我目前正在使用mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

Add:我想避免爲每個INT列添加「檢查點」(How do I check to see if a value is an integer in MySQL?)。在鑄造到INT期間數據丟失時,我更願意發出警告。

+0

「檢查點」是解決此問題的一種更簡單的方法,絕不會少,我對讀取解決方案非常感興趣 – GregD

回答

8

你可以使用一個DECIMAL(n, 0)類型,而不是INT。試圖向這樣的列中插入非整數號碼會引發警告。

CREATE TEMPORARY TABLE t (id DECIMAL); -- equivalent to the default DECIMAL(10, 0), which covers the range of INT 
INSERT INTO t VALUES (0.9); -- raises warning "1265 - Data truncated for column 'id' at row 1" 
SELECT * FROM t; -- 0.9 was rounded to 1 

我知道這只是一種變通方法,肯定對性能(儘管可能是未成年人)有負面影響。但這是我能夠想到的唯一接近的解決方案。

+0

+1因爲我相信它是迄今爲止唯一的解決方案:) – Stephan

+0

爲什麼不把它放在更新或插入觸發器上,以便您可以自動提高錯誤? –

4

編輯:我已經測試了不同的方案,試圖在得到警告或至少一個錯誤的這一點,但沒有運氣,所以我懷疑它的任何一個預期的行爲或它的一個MySQL的錯誤(雖然我沒有發現一個已知的bug描述這一點),所以我認爲最好的/唯一的解決辦法是在一個張貼YaK

使用此:

傳統

使MySQL像「傳統」SQL數據庫系統一樣工作。當 向列中插入不正確的值時,此模式的簡單 說明是「給出錯誤而不是警告」。

set global sql_mode="TRADITIONAL"; 

欲瞭解更多信息閱讀this

UPDATE:我上面所說的旨意是讓一個錯誤,而不是一個警告,因爲與數據的警告仍然如此插入,你將有損壞的數據,但如果你仍然想使用的警告,而不是錯誤的,那麼你必須使用默認的sql_mode:

set global sql_mode=""; 

編輯:確保警告已啓用:

set global sql_warnings=1; 

更好,但你可以將其添加我n配置文件my.cnf,以便在mysql重新啓動時不會被覆蓋。

enter image description here

+0

我最初考慮過這個解決方案,但它沒有發出警告(更不用說錯誤)無論是SQL模式。你使用什麼版本(我有5.5.31)? – RandomSeed

+1

嗯,你確定沒有警告提出?你是否運行過「SHOW WARNINGS」? – Stephan

+0

是的,請看[this fiddle](http://sqlfiddle.com/#!2/da92e)。前兩個蟲子成功描述(但只有第二個蟲子在我的本地主機上發出警告)。注意第三個沒有任何警告成功。只有第四個提出了一個錯誤。 *對於多個編輯抱歉,我與所有這些選項卡混在一起;)* – RandomSeed

相關問題