2012-01-09 5 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

Это очень полезная идея. Я изменил некоторые поля на unsigned, но они вызвали существующие методы обработки ошибок, и мне пришлось их удалить. Это полезно, чтобы избежать бесцельного запроса/подключения для проверки. – M1ke

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 целое число в неподписанный int столбец не будет вызывать ошибку – Raaghu

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

+0

@ user962449 Я не знаю, я никогда не включал такую ​​ошибку. Почему бы вам не попробовать? – Alnitak

1

Если вы работаете в строгом режиме SQL это будет сгенерировано сообщение об ошибке и вставки/обновления потерпит неудачу.

Я обычно создаю пользовательскую функцию для такого рода вещей. (В этом случае очень тривиальное «if (expr1, expr2, expr3)» будет делать трюк

Смежные вопросы