J'essaie donc d'ajouter des contraintes de clé étrangère à ma base de données en tant qu'exigence de projet et cela a fonctionné la première fois ou deux sur des tables différentes, mais j'ai deux tables sur lesquelles j'obtiens une erreur lorsque j'essaie d'ajouter les contraintes de clé étrangère. Le message d'erreur que je reçois est:
ERREUR 1215 (HY000): impossible d'ajouter une contrainte de clé étrangère
C'est le SQL que j'utilise pour créer les tables, les deux tables incriminées sont Patient
et Appointment
.
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=1;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
CREATE SCHEMA IF NOT EXISTS `doctorsoffice` DEFAULT CHARACTER SET utf8 ;
USE `doctorsoffice` ;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`doctor`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`doctor` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`doctor` (
`DoctorID` INT(11) NOT NULL AUTO_INCREMENT ,
`FName` VARCHAR(20) NULL DEFAULT NULL ,
`LName` VARCHAR(20) NULL DEFAULT NULL ,
`Gender` VARCHAR(1) NULL DEFAULT NULL ,
`Specialty` VARCHAR(40) NOT NULL DEFAULT 'General Practitioner' ,
UNIQUE INDEX `DoctorID` (`DoctorID` ASC) ,
PRIMARY KEY (`DoctorID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`medicalhistory`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`medicalhistory` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`medicalhistory` (
`MedicalHistoryID` INT(11) NOT NULL AUTO_INCREMENT ,
`Allergies` TEXT NULL DEFAULT NULL ,
`Medications` TEXT NULL DEFAULT NULL ,
`ExistingConditions` TEXT NULL DEFAULT NULL ,
`Misc` TEXT NULL DEFAULT NULL ,
UNIQUE INDEX `MedicalHistoryID` (`MedicalHistoryID` ASC) ,
PRIMARY KEY (`MedicalHistoryID`) )
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Patient`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Patient` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`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` smallint(5) unsigned NOT NULL,
`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;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`Appointment`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`Appointment` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`Appointment` (
`AppointmentID` smallint(5) unsigned NOT NULL AUTO_INCREMENT ,
`Date` DATE NULL ,
`Time` TIME NULL ,
`Patient` smallint(5) unsigned NOT NULL,
`Doctor` smallint(5) unsigned NOT NULL,
PRIMARY KEY (`AppointmentID`) ,
UNIQUE INDEX `AppointmentID_UNIQUE` (`AppointmentID` ASC) ,
CONSTRAINT `FK_Patient`
FOREIGN KEY (`Patient` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_Doctor`
FOREIGN KEY (`Doctor` )
REFERENCES `doctorsoffice`.`doctor` (`DoctorID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`InsuranceCompany`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`InsuranceCompany` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`InsuranceCompany` (
`InsuranceID` smallint(5) NOT NULL AUTO_INCREMENT ,
`Name` VARCHAR(50) NULL ,
`Phone` DOUBLE NULL ,
PRIMARY KEY (`InsuranceID`) ,
UNIQUE INDEX `InsuranceID_UNIQUE` (`InsuranceID` ASC) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `doctorsoffice`.`PatientInsurance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `doctorsoffice`.`PatientInsurance` ;
CREATE TABLE IF NOT EXISTS `doctorsoffice`.`PatientInsurance` (
`PolicyHolder` smallint(5) NOT NULL ,
`InsuranceCompany` smallint(5) NOT NULL ,
`CoPay` INT NOT NULL DEFAULT 5 ,
`PolicyNumber` smallint(5) NOT NULL AUTO_INCREMENT ,
PRIMARY KEY (`PolicyNumber`) ,
UNIQUE INDEX `PolicyNumber_UNIQUE` (`PolicyNumber` ASC) ,
CONSTRAINT `FK_PolicyHolder`
FOREIGN KEY (`PolicyHolder` )
REFERENCES `doctorsoffice`.`Patient` (`PatientID` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `FK_InsuranceCompany`
FOREIGN KEY (`InsuranceCompany` )
REFERENCES `doctorsoffice`.`InsuranceCompany` (`InsuranceID` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
USE `doctorsoffice` ;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
la source
set null
supprimer, mais la colonne étaitnot null
.J'avais défini un champ comme "Non signé" et un autre non. Une fois que j'ai défini les deux colonnes sur Non signé, cela a fonctionné.
la source
Watchout: Même si vos tables ont le même classement, les colonnes peuvent toujours en avoir un différent.
la source
unique
à la colonne du tableau de référence même si c'est unPrimary Key
!!Essayez d'utiliser le même type de clés primaires - int (11) - sur les clés étrangères - smallint (5) - également.
J'espère que ça aide!
la source
Confirmez que le codage et le classement des caractères pour les deux tables sont les mêmes.
Dans mon propre cas, l'une des tables utilisait
utf8
et l'autre utilisaitlatin1
.J'ai eu un autre cas où l'encodage était le même mais le classement différent. L'un
utf8_general_ci
l'autreutf8_unicode_ci
Vous pouvez exécuter cette commande pour définir l'encodage et le classement d'une table.
J'espère que ça aidera quelqu'un.
la source
Pour définir une CLÉ ÉTRANGÈRE dans le tableau B, vous devez définir une CLÉ dans le tableau A.
Dans le tableau A: INDEX
id
(id
)Et puis dans le tableau B,
la source
J'ai eu le même problème et la solution était très simple. Solution: les clés étrangères déclarées dans la table ne doivent pas être définies comme non nulles.
référence: Si vous spécifiez une action SET NULL, assurez-vous que vous n'avez pas déclaré les colonnes de la table enfant NOT NULL. ( ref )
la source
Vérifiez les règles suivantes:
Vérifie d'abord si les noms sont donnés correctement pour les noms de table
Le deuxième bon type de données donne à la clé étrangère?
la source
Veuillez vous assurer que les deux tableaux sont au format InnoDB. Même si l'un est au format MyISAM, la contrainte de clé étrangère ne fonctionnera pas.
En outre, une autre chose est que les deux champs doivent être du même type. Si l'un est INT, l'autre doit également être INT. Si l'un est VARCHAR, l'autre doit également être VARCHAR, etc.
la source
J'ai fait face au problème et j'ai pu le résoudre en m'assurant que les types de données correspondaient exactement.
J'utilisais SequelPro pour ajouter la contrainte et cela rendait la clé primaire non signée par défaut.
la source
Vérifiez la signature sur vos deux colonnes de table. Si la colonne de la table de référence est SIGNÉE, la colonne de la table référencée doit également être SIGNÉE.
la source
Pour moi, le problème était que ma table parent avait un jeu de caractères différent de celui de celui que je créais.
Table des parents (PRODUITS)
Table enfant ayant rencontré un problème (PRICE_LOGS)
MODIFIÉ À
la source
Mon problème était que j'essayais de créer la table des relations avant les autres tables!
la source
SET foreign_key_checks = 0;
J'ai eu une erreur similaire en créant une clé étrangère dans une table plusieurs à plusieurs où la clé primaire se composait de 2 clés étrangères et d'une autre colonne normale. J'ai résolu le problème en corrigeant le nom de la table référencée, c'est-à-dire la société, comme indiqué dans le code corrigé ci-dessous:
la source
J'ai eu une erreur similaire avec deux clés étrangères pour des tables différentes mais avec les mêmes noms de clés! J'ai renommé des clés et l'erreur a disparu)
la source
J'ai eu une erreur similaire, mais dans mon cas, il me manquait de déclarer le pk comme auto_increment.
Juste au cas où cela pourrait être utile à n'importe qui
la source
J'ai eu la même erreur. La cause dans mon cas était:
La cause était: depuis que j'ai utilisé phpmyadmin pour créer des clés étrangères dans la base de données renommée - les clés étrangères ont été créées avec un préfixe de nom de base de données mais le préfixe de nom de base de données n'a pas été mis à jour. Il y avait donc toujours des références dans la base de données de sauvegarde pointant vers la base de données nouvellement créée.
la source
Ma solution est peut-être un peu embarrassante et raconte pourquoi vous devriez parfois regarder ce que vous avez devant vous au lieu de ces messages :)
J'avais déjà dirigé un ingénieur avancé, ce qui a échoué, ce qui signifie que ma base de données avait déjà quelques tables, puis je me suis assis à essayer de corriger les échecs de contraintes de clés étrangères en essayant de s'assurer que tout était parfait, mais il s'est heurté à la tables précédemment créées, il ne devait donc pas prévaloir.
la source
Une autre cause de cette erreur est lorsque vos tables ou colonnes contiennent des mots clés réservés :
Parfois, on les oublie.
la source
Dans mon cas, il y a eu une erreur de syntaxe qui n'a pas été explicitement notifiée par la console MySQL lors de l'exécution de la requête. Cependant,
SHOW ENGINE INNODB STATUS
laLATEST FOREIGN KEY ERROR
section du commandement a rapporté,J'ai dû laisser un espace entre
REFERENCES
etrole
pour le faire fonctionner.la source
Pour moi, c'était - vous ne pouvez pas omettre de préfixer la table de base de données actuelle si vous créez un FK pour une base de données non actuelle référençant la base de données actuelle:
Si j'omets "currrent_db". pour la table des utilisateurs, j'obtiens l'erreur FK. Intéressant que SHOW ENGINE INNODB STATUS; ne montre rien dans ce cas.
la source
J'ai eu ce même problème, puis j'ai corrigé le nom du moteur en tant qu'Innodb dans les tables parent et enfant et corrigé le nom du champ de référence FOREIGN KEY (
c_id
) REFERENCESx9o_parent_table
(c_id
)puis cela fonctionne correctement et les tables sont installées correctement. Ce sera une utilisation complète pour quelqu'un.
la source