2012-01-09 199 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)”将会诀窍