mysql防止负数

时间:2012-01-09 20:15:43

标签: mysql

他们是mysql中的int字段,不允许使用负数吗?或者更具体地说,如果在字段中插入负数,它将插入零。我问这是因为我们有一个评分系统,我们不允许人们得分为负。因此,如果他们的分数确实达到零以下,那么它只会插入零。我试图这样做,而不必查询用户的分数,以检查它是否会下降到零。

4 个答案:

答案 0 :(得分:13)

除了其他人推荐的DDL更改(INT UNSIGNED)之外,我还会更改您的应用程序逻辑。你说:

  

我正在尝试这样做而不必查询用户的分数来检查它是否会低于零。

您不必明确签入单独的查询:

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

现在,您的应用程序无法将score更新为低于零,也不会生成错误或警告,具体取决于SQL模式。

答案 1 :(得分:11)

是。您可以创建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.

答案 2 :(得分:5)

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)

答案 3 :(得分:1)

如果您在严格的sql模式下运行,则会抛出错误,插入/更新将失败。

我通常会为这种事情创建一个用户定义的函数。 (在这种情况下,一个非常微不足道的“if(expr1,expr2,expr3)”将会起作用