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

puis inséré des valeurs dans ce tableau

 INSERT INTO Customer values ('-2','abc','zz'); 

MySQL ne montre pas d’erreur, il a accepté les valeurs.

Le manuel de référence MySQL dit:

La clause CHECK est analysée mais ignorée par tous les moteurs de stockage.

Essayez un déclencheur …

 mysql> delimiter // mysql> CREATE TRIGGER sortingg_sd_check BEFORE INSERT ON Customer -> FOR EACH ROW -> BEGIN -> IF NEW.SD<0 THEN -> SET NEW.SD=0; -> END IF; -> END -> // mysql> delimiter ; 

J’espère que cela pourra aider.

Malheureusement, MySQL ne supporte pas les contraintes de vérification SQL. Vous pouvez les définir dans votre requête DDL pour des raisons de compatibilité, mais elles sont simplement ignorées.

Il y a une alternative simple

Vous pouvez créer des déclencheurs BEFORE INSERT et BEFORE UPDATE qui provoquent une erreur ou définissent le champ sur sa valeur par défaut lorsque les exigences des données ne sont pas remplies.

Exemple pour BEFORE INSERT travaillant après MySQL 5.5

 DELIMITER $$ CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test` FOR EACH ROW BEGIN IF CHAR_LENGTH( NEW.ID ) < 4 THEN SIGNAL SQLSTATE '12345' SET MESSAGE_TEXT := 'check constraint on Test.ID failed'; END IF; END$$ DELIMITER ; 

Avant MySQL 5.5, vous deviez provoquer une erreur, par exemple appeler une procédure non définie.

Dans les deux cas, cela entraîne une annulation de transaction implicite. MySQL n'autorise pas l'instruction ROLLBACK dans les procédures et les déclencheurs.

Si vous ne voulez pas annuler la transaction (INSERT / UPDATE devrait passer même avec une "contrainte de vérification" échouée, vous pouvez écraser la valeur en utilisant SET NEW.ID = NULL qui définira l'ID sur la valeur par défaut des champs, non vraiment du sens pour une id tho

Edit: Supprime la citation parasite.

Concernant l'opérateur: :=

Contrairement à = , l'opérateur := n'est jamais interprété comme un opérateur de comparaison. Cela signifie que vous pouvez utiliser := dans toute instruction SQL valide (pas uniquement dans les instructions SET) pour atsortingbuer une valeur à une variable.

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

Concernant les citations d'identifiant de backtick:

Le caractère de citation d'identifiant est le backtick (“` ”)

Si le mode SQL ANSI_QUOTES est activé, il est également possible de citer des identifiants entre guillemets

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

CHECK contraintes CHECK sont ignorées par MySQL comme expliqué dans un minuscule commentaire dans la documentation: CREATE TABLE

La clause CHECK est analysée mais ignorée par tous les moteurs de stockage.

La contrainte CHECK ne semble pas être implémentée dans MySQL.

Voir ce rapport de bogue: https://bugs.mysql.com/bug.php?id=3464

Comme mentionné par joanq, MariaDB semble maintenant prendre en charge les contraintes CHECK parmi les autres avantages:

“Support pour CHECK CONSTRAINT ( MDEV-7563 ).”

https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/

essayez avec set sql_mode = 'STRICT_TRANS_TABLES' OU SET sql_mode='STRICT_ALL_TABLES'