Malheureusement, MySQL ne prend pas en charge les contraintes de contrôle SQL. Vous pouvez les définir dans votre requête DDL pour des raisons de compatibilité, mais elles sont tout simplement ignorées.
Il existe une alternative simple
Vous pouvez créer BEFORE INSERT
y BEFORE UPDATE
des déclencheurs qui provoquent une erreur ou définissent le champ à sa valeur par défaut lorsque les exigences des données ne sont pas satisfaites.
Exemple pour BEFORE INSERT
fonctionne 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 en appelant une procédure non définie.
Dans les deux cas, cela provoque un retour en arrière implicite de la transaction. MySQL n'autorise pas l'instruction ROLLBACK elle-même dans les procédures et les déclencheurs.
Si vous ne voulez pas annuler la transaction (INSERT / UPDATE devrait passer même si la "contrainte de vérification" a échoué), vous pouvez écraser la valeur en utilisant la méthode suivante SET NEW.ID = NULL
qui donnera à l'id la valeur par défaut du champ, ce qui n'a pas vraiment de sens pour un id.
Edit : J'ai supprimé la citation perdue.
Concernant le :=
opérateur :
Contrairement à =
le :=
n'est jamais interprété comme un opérateur de comparaison. Cela signifie que vous pouvez utiliser :=
dans toute instruction SQL valide (pas seulement dans les instructions SET) pour attribuer une valeur à une variable.
https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Concernant les citations de l'identificateur de backtick :
Le caractère de citation d'identification est le backtick ("`").
Si le mode SQL ANSI_QUOTES est activé, il est également possible de citer les identifiants entre guillemets doubles.
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
0 votes
Partiellement d'accord. Étant donné que vous avez essayé de l'utiliser, on peut supposer que vous posiez les deux questions. En fait, la réponse que vous avez acceptée explique principalement pourquoi il ne fonctionne pas.
1 votes
Vous pouvez voter sur cette demande de fonctionnalité : bugs.mysql.com/bug.php?id=3464 mais elle n'a pas reçu d'attention depuis une décennie.
11 votes
Vous pouvez utiliser les contraintes CHECK dans MariaDB à partir de version 10.2.1 .
1 votes
Maintenant que MySQL 8.0.16 a enfin résolu ce problème, il serait temps de reconnaître également les spécifications REFERENCES en ligne ignorées silencieusement ( !) (l'autre grande incompatibilité de la norme SQL) : bugs.mysql.com/bug.php?id=102904 .
0 votes
Dans MySQL 8.x le support de CHECK CONSTRAINT est présent