Maison > base de données > tutoriel mysql > Pourquoi les contraintes MySQL CHECK échouent-elles dans les versions antérieures à 8.0.16 ?

Pourquoi les contraintes MySQL CHECK échouent-elles dans les versions antérieures à 8.0.16 ?

Patricia Arquette
Libérer: 2025-01-10 10:43:43
original
313 Les gens l'ont consulté

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

Problème d'échec de la contrainte MySQL CHECK

Lors de la définition des tables de base de données, il est important d'ajouter des contraintes pour garantir l'intégrité des données. Les contraintes CHECK vous permettent de spécifier les conditions que les valeurs d'une colonne spécifique doivent remplir. Cependant, dans MySQL 8.0.15 et versions antérieures, les contraintes CHECK ne sont pas appliquées, ce qui constitue un cas particulier.

Exemple :

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>
Copier après la connexion

Après avoir créé ce tableau, essayez d'insérer des lignes avec des valeurs SD négatives :

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>
Copier après la connexion

MySQL ne signalera pas d'erreur, même si la valeur insérée viole la contrainte CHECK spécifiée. En effet, selon le manuel de référence MySQL :

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>
Copier après la connexion

Solution :

Pour résoudre ce problème, vous pouvez effectuer l'une des opérations suivantes :

  • Mise à niveau vers MySQL 8.0.16 ou supérieur : Cette version commence à prendre en charge les contraintes CHECK. Consultez la documentation MySQL pour plus de détails.
  • Implémenter des déclencheurs : Les déclencheurs peuvent être utilisés pour forcer des contraintes que le moteur de stockage ignore. La création d'un déclencheur qui vérifie la valeur SD avant l'insertion, comme indiqué ci-dessous, peut appliquer efficacement la contrainte :
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>
Copier après la connexion

Veuillez noter que l'exemple de déclenchement ci-dessus définit la valeur SD des nombres négatifs sur 0, vous pouvez modifier la logique de déclenchement en fonction de vos besoins réels.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal