2012-01-09 201 views
6

是他們的一個int字段在mysql中負數不允許?或者更具體地說,如果在該字段中插入一個負數,它將插入一個零。我問這是因爲我們有一個得分系統,我們不允許人們得到負分數。因此,如果他們的分數達到零下,它將只是插入一個零。我試圖做到這一點,而不必查詢用戶的分數來檢查它是否會下降到零。mysql防止負數

回答

12

除了其他人推薦的DDL更改(INT UNSIGNED)之外,我還會更改您的應用程序邏輯。說:

我試圖做到這一點,而無需查詢用戶的評分,以檢查它是否會下降波紋管零

你不必在一個單獨的顯式檢查。查詢:

UPDATE your_table 
    SET score = GREATEST(score + ?, 0) -- This '?' is the adjustment to the score 
WHERE user_id = ? 

現在,您的應用程序無法將score更新爲低於零,也不會根據SQL模式生成錯誤或警告。

+0

這是一個非常有用的想法。我已經將一些字段更改爲無符號,但他們觸發了現有的錯誤處理方法,我不得不刪除它們。這對避免無意義的查詢/連接進行檢查很有用。 – M1ke 2013-10-30 11:43:44

9

是的。您可以創建一個int字段並將其標記爲UNSIGNED

enter image description here

MySQL 5.0 Reference Manual

INT[(M)] [UNSIGNED] [ZEROFILL] 

A normal-size integer. The signed range is -2147483648 to 2147483647. 
The unsigned range is 0 to 4294967295. 
+0

但試圖插入-ve整數到unsigned int列不會拋出錯誤 – Raaghu 2018-01-06 17:05:28

4

MySQL有一個UNSIGNED預選賽整數類型。

負值將被鉗位到零,但會產生一個警告:

mysql> create table test (id int(5) unsigned not null); 
Query OK, 0 rows affected (0.05 sec) 

mysql> insert into test values (-1), (5), (10); 
Query OK, 3 rows affected, 1 warning (0.01 sec) 
Records: 3 Duplicates: 0 Warnings: 1 

mysql> select * from test; 
+----+ 
| id | 
+----+ 
| 0 | 
| 5 | 
| 10 | 
+----+ 
3 rows in set (0.01 sec) 
+0

如果我遇到錯誤捕獲,該警告是否會導致mysql錯誤? – user962449 2012-01-09 20:31:33

+0

@ user962449我不知道,我從來沒有打開過這樣的錯誤。你爲什麼不嘗試它? – Alnitak 2012-01-09 20:35:40

1

如果是在嚴格模式下運行,這將引發錯誤和插入/更新將失敗。

我通常會爲這類事情創建一個用戶定義的函數。 (在這種情況下,一個非常簡單的「if(expr1,expr2,expr3)」將會訣竅