Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment ajouter une contrainte d'entier positif à une colonne entière dans MySQL ?

Vous utiliseriez le mot-clé unsigned pour signifier que l'entier n'autorise pas de "signe" (c'est-à-dire qu'il ne peut être que positif) :

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

Vous pouvez en savoir plus sur les types de données numériques (signés et non signés) ici .

En tant que contrainte réelle pour empêcher l'insertion de valeurs négatives, MySQL a un CHECK clause pouvant être utilisée dans la CREATE TABLE déclaration, cependant, selon la documentation :

Pour référence, voici comment vous l'utiliseriez (et bien qu'il s'exécute parfaitement, il ne fait rien - comme l'indique le manuel) :

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

MISE À JOUR (rejeter complètement les valeurs négatives)
J'ai remarqué dans quelques-uns de vos commentaires que vous souhaitiez que les requêtes avec des valeurs négatives soient complètement rejetées et ne soient pas définies sur 0 (comme une transaction normale dans un unsigned colonne ferait l'affaire). Il n'y a aucune contrainte qui peut faire cela en général (à ma connaissance, du moins), cependant, si vous activez le mode strict (avec STRICT_TRANS_TABLES ) toute requête qui insère une valeur négative dans une colonne non signée échouera avec une erreur (ainsi que toute autre erreur d'insertion de données, telle qu'un enum non valide valeur).

Vous pouvez le tester en exécutant la commande suivante avant vos commandes d'insertion :

SET @@SESSION.sql_mode = 'STRICT_TRANS_TABLES';

Et si cela fonctionne pour vous, vous pouvez soit mettre à jour votre configuration MySQL avec sql-mode="STRICT_TRANS_TABLES" ou utilisez SET @@GLOBAL.sql_mode = 'STRICT_TRANS_TABLES'; (Je ne sais pas si le SET affectera la configuration globale de mysql, il peut donc être préférable de mettre à jour le fichier de configuration réel).