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

J'ai défini une colonne MySQL sur NOT NULL mais je peux toujours insérer une valeur vide

CHAÎNES VIDE

Dans ORACLE, une chaîne vide est utilisée pour représenter NUL. Dans pratiquement tout le reste, cependant, une chaîne vide est toujours une chaîne, et donc pas NULL.


INTS

Dans votre cas, vous insérez en fait STRINGS dans une colonne INT. Cela force un implicite Opération CAST.

Lorsque votre SGBDR convertit la chaîne '' à un INT, il doit prendre la valeur 0. Comme 0 n'est pas NULL, ceci est inséré.

Un test plus valide serait :

INSERT INTO `plekz`.`countries` (`Column1 ` , `Column2`)
VALUES (66, NULL);


MODIFIER

Désolé, je n'ai lu qu'à moitié votre question. Vous demandez également comment arrêter '' en cours d'insertion.

Votre premier problème est que vous insérez STRINGS et que la table est définie comme ayant des champs INT. Vous pouvez mettre des contraintes sur les données insérées, mais ces contraintes s'appliqueront à la valeur après une conversion en INT. Sauf si vous voulez empêcher la valeur 0 d'être également inséré, vous ne pouvez rien faire pour empêcher ce scénario.

Votre meilleur pari est d'expliquer pourquoi vous insérez des chaînes en premier lieu. Vous pouvez utiliser une procédure stockée qui prend et vérifie les chaînes avant de les convertir en INT, puis de les insérer. Ou, mieux encore, vous pouvez effectuer les vérifications dans votre application client.

Une option techniquement disponible est de faire des champs des champs CHAR, puis de mettre une contrainte sur les champs, empêchant '' d'être inséré. Je voudrais fortement déconseiller cela.