2012-11-05 144 views

回答

13

你會使用關鍵字unsigned,以表明該整數不允許「簽到」(即 - 它只能爲正) :

CREATE TABLE test (
    test_column int(11) unsigned 
); 

你可以閱讀更多有關數字數據類型(簽署&無符號)here

至於實際約束,以防止插入的負值,MySQL有可在CREATE TABLE語句中使用一個CHECK子句,然而,根據該文檔:

的CHECK子句被解析,但被所有存儲引擎忽略。

僅供參考,這裏是你將如何使用它(儘管它會執行精絕,只是什麼都不做 - 爲手動狀態):

CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0) 
); 

UPDATE(剔除負值完全)
我從幾個要與負值查詢被完全拒絕,而不是設置爲0(作爲一個正常的交易爲unsigned列會做)你的評論注意到。沒有約束,可以在總做到這一點(我知道的,至少),但是,如果你打開嚴格模式(與STRICT_TRANS_TABLES),其插入一個負值無符號列的任何查詢將失敗,錯誤(與任何-其他數據插入錯誤,如無效enum值一起)。

您可以通過您的插入的命令之前,運行以下命令進行測試:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES'; 

如果你的作品,你可以用sql-mode="STRICT_TRANS_TABLES"更新你的MySQL配置或使用​​(我不知道,如果SET命令將影響全球的MySQL配置的,因此它可能是更好的更新實際的配置文件)。

+3

'unsigned' <>正值。 'unsigned' ==不是負數。 – maxhb

0

解決這個問題的辦法就是明確地告訴MySQL服務器創建一個無符號整數。

CREATE TABLE tbl_example ( 
example_id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
example_num INT UNSIGNED NOT NULL, 
example_text TEXT 
PRIMARY KEY (`example_id`) 
); 
+0

這是我所得到的,當我在我的本地MySQL服務器上運行下面的語句 'MySQL的「插入世界值(-2);'' 查詢行,1行受影響,1個警告(0.01秒)' – user462455

1

只是使用unsigned只允許正值。

CREATE TABLE hello 
(
    world int unsigned 
); 

取消對該行,你會看到錯誤說:數據截斷:出於對列 '世界' 範圍值在第1行:

+0

但無符號類型仍允許插入負整數(它將負整數轉換爲零)。它拋出一個警告,但仍然查詢通過 – user462455

+0

這是我所得到的,當我在我的本地MySQL服務器上運行下面的語句 'MySQL的「插入世界值(-2);'' 查詢行,1行受影響,1次警告(0.01秒)' – user462455