La contrainte CHECK dans MySQL ne fonctionne pas
J'ai d'abord créé un tableau comme
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
et puis insérer les valeurs dans la table
INSERT INTO Customer values ('-2','abc','zz');
MySQL n'indique pas une erreur, il a accepté les valeurs.
source d'informationauteur JohnRaja
Vous devez vous connecter pour publier un commentaire.
La Manuel De Référence De MySQL dit:
Essayer un déclencheur...
Espère que ça aide.
Malheureusement MySQL ne prend pas en charge SQL contraintes check. Vous pouvez définir dans votre requête DDL pour des raisons de compatibilité, mais ils sont tout simplement ignorées.
Il existe une alternative simple
Vous pouvez créer
BEFORE INSERT
etBEFORE UPDATE
déclencheurs qui provoquent une erreur ou définir le champ à sa valeur par défaut lorsque les exigences en matière de données ne sont pas remplies.Exemple pour
BEFORE INSERT
de travail après MySQL 5.5Avant MySQL 5.5-vous eu à cause d'une erreur, par exemple, appeler un indéfini procédure.
Dans les deux cas, cela entraîne implicitement l'annulation de la transaction.
MySQL ne permet pas de l'instruction ROLLBACK lui-même au sein des procédures et des déclencheurs.
Si vous ne voulez pas annuler la transaction ( INSERTION /mise à JOUR devrait passer même de l'échec d'une "contrainte check" vous pouvez remplacer la valeur à l'aide de
SET NEW.ID = NULL
qui permettra de définir l'identifiant les champs de valeur par défaut, n'a pas vraiment de sens pour une id thoEdit:
Enlevé la divagation des devis.
Concernant la
:=
opérateur:https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Concernant backtick identificateur de citations:
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
CHECK
les contraintes sont ignorées par MySQL comme expliqué dans un minuscule commentaire dans les docs:CREATE TABLE
La
CHECK
contrainte ne semble pas être mis en œuvre dans MySQL.Voir ce rapport de bug: https://bugs.mysql.com/bug.php?id=3464
Comme mentionné par joanq MariaDB semble maintenant à l'appui de la VÉRIFICATION des contraintes entre autres goodies:
"Soutien pour la VÉRIFICATION de la CONTRAINTE (MDEV-7563)."
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
essayer avec
set sql_mode = 'STRICT_TRANS_TABLES'
OUSET sql_mode='STRICT_ALL_TABLES'