MySQL Code d'erreur 1215: Impossible d'ajouter une contrainte de clé étrangère


Exemple

Cette erreur se produit lorsque les tables ne sont pas structurées de manière adéquate pour gérer la vérification rapide des exigences de clé étrangère ( FK ) que le développeur impose.

CREATE TABLE `gtType` (
  `type` char(2) NOT NULL,
  `description` varchar(1000) NOT NULL,
  PRIMARY KEY (`type`)
) ENGINE=InnoDB;

CREATE TABLE `getTogethers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `type` char(2) NOT NULL,
  `eventDT` datetime NOT NULL,
  `location` varchar(1000) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_gt2type` (`type`), -- see Note1 below 
  CONSTRAINT `gettogethers_ibfk_1` FOREIGN KEY (`type`) REFERENCES `gtType` (`type`)
) ENGINE=InnoDB;

Note 1: une KEY comme celle-ci sera créée automatiquement si nécessaire en raison de la définition FK dans la ligne qui la suit. Le développeur peut l'ignorer et le KEY (aka index) sera ajouté si nécessaire. Un exemple d’évitement par le développeur est montré ci-dessous dans une someOther .

Jusqu'ici tout va bien, jusqu'à l'appel ci-dessous.

CREATE TABLE `someOther` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `someDT` datetime NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `someOther_dt` FOREIGN KEY (`someDT`) REFERENCES `getTogethers` (`eventDT`)
) ENGINE=InnoDB;

Code d'erreur: 1215. Impossible d'ajouter une contrainte de clé étrangère

Dans ce cas, il échoue en raison de l'absence d'index dans la table référencée getTogethers pour gérer la recherche rapide d'un eventDT . À résoudre dans la prochaine déclaration.

CREATE INDEX `gt_eventdt` ON getTogethers (`eventDT`);

La table getTogethers a été modifiée et maintenant la création de someOther réussira.

À partir de la page du manuel MySQL Utilisation des contraintes FOREIGN KEY :

MySQL nécessite des index sur les clés étrangères et les clés référencées afin que les vérifications de clés étrangères puissent être rapides et ne nécessitent pas d'analyse de table. Dans la table de référence, il doit y avoir un index où les colonnes de la clé étrangère sont répertoriées comme les premières colonnes du même ordre. Un tel index est créé automatiquement sur la table de référence s'il n'existe pas.

Les colonnes correspondantes dans la clé étrangère et la clé référencée doivent avoir des types de données similaires. La taille et le signe des types entiers doivent être identiques. La longueur des types de chaîne ne doit pas nécessairement être la même. Pour les colonnes de chaîne non binaires (caractères), le jeu de caractères et le classement doivent être identiques.

InnoDB permet à une clé étrangère de référencer une colonne d'index ou un groupe de colonnes. Toutefois, dans la table référencée, il doit y avoir un index où les colonnes référencées sont répertoriées comme les premières colonnes du même ordre.

Notez le dernier point ci-dessus concernant les premières colonnes (les plus à gauche) et l’absence de condition de clé primaire (bien que fortement recommandée).

Après la création d'une table de référence (enfant), toutes les clés créées automatiquement pour vous sont visibles avec une commande telle que:

SHOW CREATE TABLE someOther;

Parmi les autres cas courants d’expérience de cette erreur, citons les documents ci-dessus, mais ils doivent être mis en évidence:

  • Différences apparemment insignifiantes de l’ INT qui sont signées, pointant vers INT UNSIGNED .

  • Les développeurs ont du mal à comprendre les KEYS multi-colonnes (composites) et les premières exigences de commande (les plus à gauche).