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 cette table
INSERT INTO Customer values ('-2','abc','zz');
MySQL n'affiche pas d'erreur, il a accepté les valeurs.
mysql
check-constraints
JohnRaja
la source
la source
Réponses:
MySQL 8.0.16 est la première version qui prend en charge les contraintes CHECK.
Lisez https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
Si vous utilisez MySQL 8.0.15 ou une version antérieure, le manuel de référence MySQL dit:
Essayez un déclencheur ...
J'espère que cela pourra aider.
la source
CHECK
contrainte définie. Ahhh, ce serait trop simple ...Malheureusement, MySQL ne prend pas en charge les contraintes de vérification SQL. Vous pouvez les définir dans votre requête DDL pour des raisons de compatibilité, mais ils sont simplement ignorés.
Il existe une alternative simple
Vous pouvez créer
BEFORE INSERT
etBEFORE UPDATE
déclencher des déclencheurs qui provoquent une erreur ou définissent le champ sur sa valeur par défaut lorsque les exigences des données ne sont pas satisfaites.Exemple de
BEFORE INSERT
travail après MySQL 5.5Avant MySQL 5.5, vous deviez provoquer une erreur, par exemple appeler une procédure non définie.
Dans les deux cas, cela provoque une annulation de transaction implicite. 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 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, cela n'a pas vraiment de sens pour un id thoEdit: Suppression du devis errant.
Concernant l'
:=
opérateur:https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html
Concernant les guillemets d'identifiant backtick:
http://dev.mysql.com/doc/refman/5.6/en/identifiers.html
la source
DELIMITER
?CHECK
les contraintes sont ignorées par MySQL comme expliqué dans un commentaire minuscule dans la documentation:CREATE TABLE
la source
CHECK
contraintes, si l'CHECK
évaluation àFALSE
alors l'insertion (ou la mise à jour) n'est pas faite et une erreur est provoquée.La
CHECK
contrainte ne semble pas être implémentée dans MySQL.Voir ce rapport de bogue: https://bugs.mysql.com/bug.php?id=3464
la source
Comme mentionné par joanq, MariaDB semble désormais prendre en charge les contraintes CHECK parmi d'autres goodies:
"Prise en charge de CHECK CONSTRAINT ( MDEV-7563 )."
https://mariadb.com/kb/en/mariadb/mariadb-1021-release-notes/
la source
Les contraintes de vérification sont prises en charge à partir de la version 8.0.15 (pas encore publiée)
https://bugs.mysql.com/bug.php?id=3464
la source
Mettez à jour vers MySQL 8.0.16 pour utiliser
checks
:Documentation des vérifications MySQL
la source
essayez avec
set sql_mode = 'STRICT_TRANS_TABLES'
OUSET sql_mode='STRICT_ALL_TABLES'
la source
CHECK
contrainte