sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo agregar una restricción de entero positivo a una columna de enteros en MySQL?

Usarías la palabra clave unsigned para indicar que el número entero no permite un "signo" (es decir, solo puede ser positivo):

CREATE TABLE test (
    test_column int(11) unsigned
);

Puede leer más sobre los tipos de datos numéricos (con y sin firmar) aquí .

En cuanto a una restricción real para evitar la inserción de valores negativos, MySQL tiene un CHECK cláusula que se puede usar en CREATE TABLE declaración, sin embargo, según la documentación:

Como referencia, así es como lo usaría (y aunque se ejecutará absolutamente bien, simplemente no hace nada, como dice el manual):

CREATE TABLE test (
    test_column int(11) unsigned CHECK (test_column > 0)
);

ACTUALIZAR (rechazar valores negativos por completo)
He notado en algunos de sus comentarios que desea que las consultas con valores negativos se rechacen por completo y no se establezcan en 0 (como una transacción normal en un unsigned columna haría). No hay ninguna restricción que pueda hacer esto en general (que yo sepa, al menos), sin embargo, si activa el modo estricto (con STRICT_TRANS_TABLES ) cualquier consulta que inserte un valor negativo en una columna sin firmar fallará con un error (junto con cualquier otro error de inserción de datos, como un enum no válido valor).

Puede probarlo ejecutando el siguiente comando antes de sus comandos de inserción:

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

Y si funciona para usted, puede actualizar su configuración de MySQL con sql-mode="STRICT_TRANS_TABLES" o use SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES'; (No estoy seguro si SET Sin embargo, el comando afectará la configuración global de mysql, por lo que puede ser mejor actualizar el archivo de configuración real).