2012-01-09 29 views
6

¿Es su un campo int en mysql donde los números negativos no están permitidos? o más específicamente si se inserta un número negativo en el campo, insertará un cero. Pregunto esto porque tenemos un sistema de puntuación y no permitimos que las personas tengan puntuaciones negativas. Entonces, si su puntaje llega a cero, simplemente insertará un cero en su lugar. Intento hacer esto sin tener que consultar el puntaje del usuario para verificar si caerá por debajo de cero.mysql previene los números negativos

Respuesta

12

Además del cambio DDL (INT UNSIGNED) que otros han recomendado, también cambiaría la lógica de la aplicación. decir:

estoy tratando de hacer esto sin tener que consultar la puntuación del usuario para comprobar si va a caer bajo cero

Usted no tiene que comprobar explícitamente en un aparte. consulta:

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

Ahora su aplicación no puede ACTUALIZAR score para caer bajo cero, ni generará errores o advertencias dependiendo del modo SQL.

+0

Esta es una idea muy útil. Cambié algunos campos a unsigned pero desencadenaron métodos de manejo de errores existentes y tuve que eliminarlos. Esto es útil para evitar una consulta/conexión sin sentido para verificar. – M1ke

9

Sí. Puede crear un campo int y marcarlo como UNSIGNED.

enter image description here

De 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

Pero tratar de insertar -ve entero en la columna no firmada no arrojará el error – Raaghu

4

MySQL tiene un calificador UNSIGNED de los tipos enteros.

Los valores negativos se pueden fijar a cero, sino que generará una advertencia:

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

¿La advertencia causará un error de mysql si tengo un error de captura? – user962449

+0

@ user962449 No lo sé, nunca he activado la captura de errores de esa manera. ¿Por qué no lo intentas? – Alnitak

1

Si está ejecutando en modo estricto SQL esta lanzaría un error y una inserción/actualización fallaría.

Creo que usualmente creo una función definida por el usuario para este tipo de cosas. (En este caso, un "if (expr1, expr2, expr3) muy trivial" hará el truco

Cuestiones relacionadas