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
Patricia Arquetteoriginal
2025-01-10 10:43:43314parcourir

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>

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>

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>

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>

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!

Déclaration:
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