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).