Ich versuche also, meiner Datenbank als Projektanforderung Fremdschlüsseleinschränkungen hinzuzufügen, und es hat beim ersten oder zweiten Mal in verschiedenen Tabellen funktioniert, aber ich habe zwei Tabellen, bei denen beim Versuch, die Fremdschlüsseleinschränkungen hinzuzufügen, eine Fehlermeldung angezeigt wird. Die Fehlermeldung, die ich erhalte, lautet:
FEHLER 1215 (HY000): Fremdschlüsseleinschränkung kann nicht hinzugefügt werden
Dies ist das SQL, mit dem ich die Tabellen erstelle. Die beiden fehlerhaften Tabellen sind Patient
und 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;
quelle
set null
löschen, aber die Spalte warnot null
.Ich hatte ein Feld als "Unsigned" gesetzt und das andere nicht. Nachdem ich beide Spalten auf Unsigned gesetzt hatte, funktionierte es.
quelle
Watchout: Auch wenn Ihre Tabellen dieselbe Sortierung haben, können Spalten dennoch eine andere haben.
quelle
unique
Spalte der Referenztabelle explizit hinzufügen muss , obwohl es einPrimary Key
!!Versuchen Sie, den gleichen Typ Ihrer Primärschlüssel - int (11) - auch für die Fremdschlüssel - smallint (5) - zu verwenden.
Ich hoffe es hilft!
quelle
Stellen Sie sicher, dass die Zeichenkodierung und Sortierung für die beiden Tabellen identisch ist.
In meinem Fall wurde eine der Tabellen verwendet
utf8
und die anderelatin1
.Ich hatte einen anderen Fall, in dem die Codierung gleich war, die Sortierung jedoch unterschiedlich. Eins
utf8_general_ci
das andereutf8_unicode_ci
Sie können diesen Befehl ausführen, um die Codierung und Sortierung für eine Tabelle festzulegen.
Ich hoffe das hilft jemandem.
quelle
Um einen AUSLÄNDISCHEN SCHLÜSSEL in Tabelle B festzulegen, müssen Sie einen SCHLÜSSEL in Tabelle A festlegen.
In Tabelle A: INDEX
id
(id
)Und dann in der Tabelle B,
quelle
Ich hatte das gleiche Problem und die Lösung war sehr einfach. Lösung: In der Tabelle deklarierte Fremdschlüssel sollten nicht auf null gesetzt werden.
Referenz: Wenn Sie eine SET NULL-Aktion angeben, stellen Sie sicher, dass Sie die Spalten in der untergeordneten Tabelle nicht als NOT NULL deklariert haben. ( ref )
quelle
Überprüfen Sie die folgenden Regeln:
Überprüft zunächst, ob Namen für Tabellennamen richtig angegeben sind
Zweiter richtiger Datentyp für Fremdschlüssel?
quelle
Bitte stellen Sie sicher, dass beide Tabellen im InnoDB-Format vorliegen. Selbst wenn eines im MyISAM-Format vorliegt, funktioniert die Fremdschlüsseleinschränkung nicht.
Eine andere Sache ist, dass beide Felder vom gleichen Typ sein sollten. Wenn einer INT ist, sollte der andere ebenfalls INT sein. Wenn einer VARCHAR ist, sollte der andere auch VARCHAR usw. sein.
quelle
Ich war mit dem Problem konfrontiert und konnte es beheben, indem ich sicherstellte, dass die Datentypen genau übereinstimmten.
Ich habe SequelPro zum Hinzufügen der Einschränkung verwendet und den Primärschlüssel standardmäßig als vorzeichenlos festgelegt.
quelle
Überprüfen Sie die Signatur in beiden Tabellenspalten. Wenn die referenzierende Tabellenspalte SIGNIERT ist, sollte auch die referenzierte Tabellenspalte SIGNIERT sein.
quelle
Für mich war das Problem, dass meine übergeordnete Tabelle einen anderen Zeichensatz hatte als der, den ich erstellt habe.
Elterntabelle (PRODUKTE)
Untergeordnete Tabelle, bei der ein Problem aufgetreten ist (PRICE_LOGS)
GEÄNDERT AUF
quelle
Mein Problem war, dass ich versucht habe, die Beziehungstabelle vor anderen Tabellen zu erstellen!
quelle
SET foreign_key_checks = 0;
Ich hatte einen ähnlichen Fehler beim Erstellen eines Fremdschlüssels in einer Many to Many-Tabelle, in der der Primärschlüssel aus 2 Fremdschlüsseln und einer weiteren normalen Spalte bestand. Ich habe das Problem behoben, indem ich den Namen der referenzierten Tabelle, dh Firma, korrigiert habe, wie im korrigierten Code unten gezeigt:
quelle
Ich hatte einen ähnlichen Fehler mit zwei Fremdschlüsseln für verschiedene Tabellen, aber mit denselben Schlüsselnamen! Ich habe Schlüssel umbenannt und der Fehler war verschwunden.
quelle
Hatte einen ähnlichen Fehler, aber in meinem Fall fehlte es mir, das pk als auto_increment zu deklarieren.
Nur für den Fall, dass es für jemanden hilfreich sein könnte
quelle
Ich habe den gleichen Fehler bekommen. Die Ursache in meinem Fall war:
Die Ursache war: Da ich phpmyadmin verwendet habe, um einige Fremdschlüssel in der umbenannten Datenbank zu erstellen, wurden die Fremdschlüssel mit einem Datenbanknamenpräfix erstellt, aber das Datenbanknamenpräfix wurde nicht aktualisiert. Es gab also immer noch Verweise in der Backup-Datenbank, die auf die neu erstellte Datenbank verweisen.
quelle
Meine Lösung ist vielleicht etwas peinlich und erzählt die Geschichte, warum Sie manchmal auf das schauen sollten, was Sie vor sich haben, anstatt auf diese Beiträge :)
Ich hatte zuvor einen Forward Engineer ausgeführt, was fehlgeschlagen war. Das bedeutete, dass meine Datenbank bereits einige Tabellen enthielt. Dann habe ich versucht, Fehler bei Fremdschlüsselbeschränkungen zu beheben, um sicherzustellen, dass alles perfekt war, aber es lief gegen die zuvor erstellte Tabellen, so dass es keine Vorherrschaft gab.
quelle
Eine weitere Ursache für diesen Fehler ist, wenn Ihre Tabellen oder Spalten reservierte Schlüsselwörter enthalten :
Manchmal vergisst man diese.
quelle
In meinem Fall gab es einen Syntaxfehler, der von der MySQL-Konsole beim Ausführen der Abfrage nicht explizit benachrichtigt wurde. Der
SHOW ENGINE INNODB STATUS
BefehlsabschnittLATEST FOREIGN KEY ERROR
berichtete jedoch:Ich musste ein Leerzeichen dazwischen lassen
REFERENCES
undrole
es funktionieren lassen.quelle
Für mich war es - Sie können das Präfixieren der aktuellen DB-Tabelle nicht auslassen, wenn Sie eine FK für eine nicht aktuelle DB erstellen, die auf die aktuelle DB verweist:
Wenn ich "currrent_db" weglasse. Für die Benutzertabelle erhalte ich den FK-Fehler. Interessant, dass SHOW ENGINE INNODB STATUS; zeigt in diesem Fall nichts.
quelle
Ich hatte das gleiche Problem, dann habe ich den Engine-Namen als Innodb sowohl in der übergeordneten als auch in der untergeordneten Tabelle korrigiert und den Referenzfeldnamen FOREIGN KEY (
c_id
) REFERENCESx9o_parent_table
(c_id
) korrigiert.Dann funktioniert es einwandfrei und die Tabellen sind korrekt installiert. Dies wird für jemanden voll genutzt.
quelle