Maison > base de données > tutoriel mysql > Pourquoi est-ce que j'obtiens une erreur « Impossible d'ajouter une contrainte de clé étrangère » dans MySQL et comment puis-je la corriger ?

Pourquoi est-ce que j'obtiens une erreur « Impossible d'ajouter une contrainte de clé étrangère » dans MySQL et comment puis-je la corriger ?

Mary-Kate Olsen
Libérer: 2025-01-18 20:13:10
original
162 Les gens l'ont consulté

Why Am I Getting a

Erreurs de contrainte de clé étrangère MySQL : dépannage et solutions

Rencontrer « ERREUR 1215 (HY000) : Impossible d'ajouter une contrainte de clé étrangère » dans MySQL lorsque vous travaillez avec des clés étrangères est un problème courant. Cette erreur se produit généralement lors de la création ou de la modification d'une table lors de la définition de relations de clé étrangère. Le problème réside souvent dans les incohérences entre les tables associées.

Le message d'erreur lui-même n'identifie pas toujours le problème exact. Pour diagnostiquer la cause spécifique, utilisez cette commande :

<code class="language-sql">SHOW ENGINE INNODB STATUS;</code>
Copier après la connexion

Examinez la section LATEST FOREIGN KEY ERROR pour obtenir des informations détaillées sur la contrainte ayant échoué.

Causes profondes et solutions

La cause la plus fréquente est une inadéquation des types de données entre la colonne de clé étrangère (dans la table enfant) et la colonne de clé primaire référencée (dans la table parent). Par exemple, si la colonne de la table enfant est SMALLINT et que la clé primaire de la table parent est INT, la contrainte échouera. Les types de données doivent correspondre précisément.

Une bonne pratique consiste à désactiver temporairement les vérifications de clés étrangères lors de la création de tables, en particulier lorsqu'il s'agit de relations complexes. Cela évite de commander les dépendances. Voici comment :

<code class="language-sql">SET FOREIGN_KEY_CHECKS = 0;
-- Your table creation statements here
SET FOREIGN_KEY_CHECKS = 1;</code>
Copier après la connexion

Exemple : Correction des écarts de type de données

Disons que les tables Patient et Appointment sont à l'origine de l'erreur. Supposons que Patient.MedicalHistory soit SMALLINT et medicalhistory.MedicalHistoryID soit INT. La solution est d'assurer la cohérence du type :

<code class="language-sql">CREATE TABLE IF NOT EXISTS `Patient` (
  `PatientID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `FName` VARCHAR(30) NULL,
  `LName` VARCHAR(45) NULL,
  `Gender` CHAR NULL,
  `DOB` DATE NULL,
  `SSN` DOUBLE NULL,
  `MedicalHistory` INT UNSIGNED NOT NULL,  -- Data type changed to match
  `PrimaryPhysician` SMALLINT(5) UNSIGNED NOT NULL,
  PRIMARY KEY (`PatientID`),
  UNIQUE INDEX `PatientID_UNIQUE` (`PatientID` ASC),
  CONSTRAINT `FK_MedicalHistory`
    FOREIGN KEY (`MedicalHistory`)
    REFERENCES `doctorsoffice`.`medicalhistory` (`MedicalHistoryID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `FK_PrimaryPhysician`
    FOREIGN KEY (`PrimaryPhysician`)
    REFERENCES `doctorsoffice`.`doctor` (`DoctorID`)
    ON DELETE CASCADE
    ON UPDATE CASCADE
) ENGINE = InnoDB;</code>
Copier après la connexion

En faisant soigneusement correspondre les types de données et en utilisant la technique recommandée de désactivation/activation de la vérification des clés étrangères, vous pouvez résoudre efficacement les erreurs de contrainte de clé étrangère et établir des relations solides au sein de votre base de données MySQL.

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