Próbuję więc dodać ograniczenia klucza obcego do mojej bazy danych jako wymóg projektu i zadziałało to po raz pierwszy lub dwa na różnych tabelach, ale mam dwie tabele, w których pojawia się błąd podczas próby dodania ograniczeń klucza obcego. Otrzymany komunikat o błędzie to:
BŁĄD 1215 (HY000): Nie można dodać ograniczenia klucza obcego
To jest SQL, którego używam do tworzenia tabel, dwie tabele obrażające to Patient
i 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;
źródło
set null
usunąć, ale kolumna byłanot null
.Ustawiłem jedno pole jako „Niepodpisane”, a drugie nie. Po ustawieniu obu kolumn jako Niepodpisane zadziałało.
źródło
Watchout: nawet jeśli twoje tabele mają to samo sortowanie, kolumny nadal mogą mieć inne.
źródło
unique
kolumnę tabeli referencyjnej, mimo że jest toPrimary Key
!!Spróbuj użyć tego samego typu kluczy podstawowych - int (11) - na kluczach obcych - smallint (5) - a także.
Mam nadzieję, że to pomoże!
źródło
Sprawdź, czy kodowanie i sortowanie znaków dla dwóch tabel jest takie samo.
W moim przypadku jedna z tabel używała,
utf8
a druga używałalatin1
.Miałem inny przypadek, w którym kodowanie było takie samo, ale sortowanie różne. Jeden
utf8_general_ci
drugiutf8_unicode_ci
Możesz uruchomić to polecenie, aby ustawić kodowanie i sortowanie dla tabeli.
Mam nadzieję, że to komuś pomoże.
źródło
Aby ustawić KLUCZ ZAGRANICZNY w tabeli B, należy ustawić KLUCZ w tabeli A.
W tabeli A: INDEKS
id
(id
)A potem w tabeli B
źródło
Miałem ten sam problem, a rozwiązanie było bardzo proste. Rozwiązanie: klucze obce zadeklarowane w tabeli nie powinny mieć wartości innej niż NULL.
referencja: Jeśli określisz akcję SET NULL, upewnij się, że kolumny w tabeli potomnej nie zostały zadeklarowane jako NOT NULL. ( ref )
źródło
Sprawdź następujące zasady:
Najpierw sprawdza, czy nazwy są poprawnie nadane dla nazw tabel
Drugi właściwy typ danych podać kluczowi obcemu?
źródło
Upewnij się, że obie tabele są w formacie InnoDB. Nawet jeśli jest w formacie MyISAM, ograniczenie klucza obcego nie zadziała.
Inną rzeczą jest to, że oba pola powinny być tego samego typu. Jeśli jeden jest INT, to drugi powinien być również INT. Jeśli jednym jest VARCHAR, drugim powinien być również VARCHAR itp.
źródło
Napotkałem problem i udało mi się go rozwiązać, upewniając się, że typy danych są dokładnie zgodne.
Użyłem SequelPro do dodania ograniczenia i domyślnie sprawiał, że klucz podstawowy był bez znaku.
źródło
Sprawdź podpisywanie w obu kolumnach tabeli. Jeśli kolumna tabeli odsyłającej jest ZNAKIEM, kolumna tabeli referencyjnej również powinna zostać ZNAKOWANA.
źródło
Dla mnie problem polegał na tym, że moja tabela nadrzędna miała inny zestaw znaków niż ten, który tworzyłem.
Stolik nadrzędny (PRODUKTY)
Stolik podrzędny, który miał problem (PRICE_LOGS)
ZMODYFIKOWANY DO
źródło
Mój problem polegał na tym, że próbowałem utworzyć tabelę relacji przed innymi tabelami!
źródło
SET foreign_key_checks = 0;
Miałem podobny błąd podczas tworzenia klucza obcego w tabeli Wiele do wielu, gdzie klucz podstawowy składał się z 2 kluczy obcych i innej normalnej kolumny. Rozwiązałem problem, poprawiając nazwę tabeli, do której istnieje odwołanie, tj. Firmę, jak pokazano w poprawionym kodzie poniżej:
źródło
Miałem podobny błąd z dwoma kluczami obcymi dla różnych tabel, ale o tych samych nazwach kluczy! Zmieniłem nazwy kluczy i błąd zniknął)
źródło
Miałem podobny błąd, ale w moim przypadku brakowało mi zadeklarowania pk jako auto_increment.
Na wszelki wypadek może być pomocny dla każdego
źródło
Mam ten sam błąd. Przyczyną w moim przypadku było:
Przyczyna była taka: odkąd użyłem phpmyadmin do utworzenia niektórych kluczy obcych w bazie danych o zmienionej nazwie - klucze obce zostały utworzone z prefiksem nazwy bazy danych, ale prefiks nazwy bazy danych nie został zaktualizowany. Tak więc w kopii zapasowej db nadal znajdowały się odwołania wskazujące na nowo utworzony db.
źródło
Moje rozwiązanie jest może trochę zawstydzające i opowiada, dlaczego zamiast tych postów powinieneś czasem spojrzeć na to, co masz przed sobą :)
Wcześniej prowadziłem inżyniera do przodu, co nie powiodło się, więc oznaczało to, że moja baza danych miała już kilka tabel, a następnie siedziałem, próbując naprawić błędy związane z kluczami obcymi, próbując upewnić się, że wszystko jest idealne, ale działało przeciwko wcześniej utworzone tabele, więc nie przeważyło.
źródło
Dodatkową przyczyną tego błędu jest sytuacja, gdy tabele lub kolumny zawierają zastrzeżone słowa kluczowe :
Czasami zapomina się o nich.
źródło
W moim przypadku wystąpił błąd składniowy, który nie został jawnie powiadomiony przez konsolę MySQL po uruchomieniu zapytania. Jednak sekcja
SHOW ENGINE INNODB STATUS
poleceniaLATEST FOREIGN KEY ERROR
zgłoszona,Musiałem zostawić spację między
REFERENCES
i,role
aby działało.źródło
Dla mnie tak było - nie można pominąć prefiksu bieżącej tabeli DB, jeśli utworzysz FK dla trwałej bazy danych odwołującej się do bieżącej bazy danych:
Jeśli pominę „currrent_db”. dla tabeli użytkowników pojawia się błąd FK. Interesujące, że POKAŻ STATUS INNODB SILNIKA; nic nie pokazuje w tym przypadku.
źródło
Miałem ten sam problem, a następnie poprawiłem nazwę silnika jako Innodb zarówno w tabelach nadrzędnych, jak i podrzędnych oraz poprawiłem nazwę pola referencyjnego
c_id
ODNOŚNIKI KLUCZA OBCYCHx9o_parent_table
(c_id
),a następnie działa poprawnie i tabele są poprawnie zainstalowane. Będzie to pełne wykorzystanie dla kogoś.
źródło