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