MySQL Nie Może Dodać Ograniczenia Klucza Obcego

Więc staram się dodać ograniczenia klucza obcego do mojej bazy danych jako wymóg projektu i to działało po raz pierwszy lub dwa na różnych tabelach, ale mam dwie tabele, na których dostaję błąd podczas próby dodania ograniczeń klucza obcego. Komunikat o błędzie, który otrzymuję to:

Nie można dodać ograniczenia klucza obcego]}

To jest SQL, którego używam do tworzenia tabel, dwie obrażające tabele 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;
Author: Anthony Neace, 2013-03-21

19 answers

Aby znaleźć konkretny błąd uruchom to:

SHOW ENGINE INNODB STATUS;

I zajrzyj do sekcji LATEST FOREIGN KEY ERROR.

Typ danych dla kolumny potomnej musi być dokładnie zgodny z kolumną rodzica. Na przykład, ponieważ medicalhistory.MedicalHistoryID jest INT, Patient.MedicalHistory również musi być INT, a nie SMALLINT.

Przed uruchomieniem DDL należy również uruchomić zapytanie set foreign_key_checks=0, aby można było tworzyć tabele w dowolnej kolejności, a nie tworzyć wszystkie tabele nadrzędne przed odpowiednimi tabelami potomnymi.

 577
Author: Ike Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-21 00:07:03

Ustawiłem jedno pole jako "niepodpisane", a drugie nie. Gdy ustawiłem obie kolumny na Unsigned to działało.

 106
Author: Satsara Gunaratne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-12 07:06:10
  • Silnik powinien być taki sam np. InnoDB
  • typ danych powinien być taki sam i o tej samej długości. np. VARCHAR(20)
  • Collation zestaw znaków kolumn powinien być taki sam. np. utf8
    Watchout: nawet jeśli tabele mają takie same zestawienia, kolumny nadal mogą mieć inne.
  • Unique - klucz obcy powinien odnosić się do pola unique (Zwykle klucz podstawowy) W referencji stolik.
 52
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 15:27:36

Spróbuj użyć tego samego typu kluczy podstawowych - int (11) - na klawiszach obcych - smallint(5) - również.

Mam nadzieję, że to pomoże!

 15
Author: Felypp Oliveira,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 21:34:45

Potwierdź, że kodowanie i sortowanie znaków dla obu tabel jest takie samo.

W moim przypadku jedna z tabel używała utf8, a druga latin1.

Miałem inny przypadek, w którym kodowanie było takie samo, ale zestawianie było inne. Jeden utf8_general_ci drugi utf8_unicode_ci

Możesz uruchomić to polecenie, aby ustawić kodowanie i sortowanie tabeli.

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Mam nadzieję, że to komuś pomoże.
 10
Author: Goke Obasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-12 11:58:31

Aby ustawić klucz obcy w tabeli B należy ustawić klucz w tabeli A.

W tabeli A: Indeks id (id)

A następnie w tabeli B,

CONSTRAINT `FK_id` FOREIGN KEY (`id`) REFERENCES `table-A` (`id`)
 6
Author: user3707075,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 04:34:35

Proszę upewnić się, że obie tabele są w formacie InnoDB. Nawet jeśli jest w formacie MyISAM, to 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 jeden jest VARCHAR, drugi powinien być również VARCHAR, itd.

 4
Author: Vijay Srinivas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-21 07:05:49

Sprawdź następujące zasady:

  • Najpierw sprawdza, czy nazwy są odpowiednie dla nazw tabel

  • Drugi prawy typ danych dać do klucza obcego ?

 3
Author: Bhaskar Bhatt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-20 19:05:12

Miałem ten sam problem i rozwiązanie było bardzo proste. Rozwiązanie: klucze obce zadeklarowane w tabeli nie powinny być ustawione na not null.

Reference: jeśli określisz akcję SET NULL, upewnij się, że kolumny w tabeli podrzędnej nie zostały zadeklarowane jako NOT NULL. (ref )

 3
Author: Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-17 21:00:30

Napotkałem problem i byłem w stanie go rozwiązać, upewniając się, że typy danych są dokładnie dopasowane .

Używałem SequelPro do dodawania ograniczenia i domyślnie robił klucz podstawowy jako niepodpisany .

 2
Author: Learner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-29 05:36:05

Miałem podobny błąd podczas tworzenia klucza obcego w tabeli wielu do wielu, gdzie klucz podstawowy składał się z 2 kluczy obcych i innej normalnej kolumny. Naprawiłem problem, poprawiając nazwę tabeli, tj. firmę, jak pokazano w poprawionym kodzie poniżej:

create table company_life_cycle__history -- (M-M)
(
company_life_cycle_id tinyint unsigned not null,
Foreign Key (company_life_cycle_id) references company_life_cycle(id) ON DELETE    CASCADE ON UPDATE CASCADE,
company_id MEDIUMINT unsigned not null,
Foreign Key (company_id) references company(id) ON DELETE CASCADE ON UPDATE CASCADE,
activity_on date NOT NULL,
PRIMARY KEY pk_company_life_cycle_history (company_life_cycle_id, company_id,activity_on),
created_on datetime DEFAULT NULL,
updated_on datetime DEFAULT NULL,
created_by varchar(50) DEFAULT NULL,
updated_by varchar(50) DEFAULT NULL
);
 0
Author: iltaf khalid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-15 08:09:20

Miałem podobny błąd z dwoma kluczami obcymi dla różnych tabel, ale z tymi samymi nazwami kluczy! Zmieniłem nazwę klucza i błąd zniknął)

 0
Author: Олег Всильдеревьев,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-08 19:35:50

Miał podobny błąd, ale w moim przypadku brakowało mi zadeklarowania pk jako auto_increment.

Na wszelki wypadek, gdyby to mogło być pomocne dla kogokolwiek

 0
Author: Luiz Rolim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-28 12:09:13

Mam ten sam błąd. Przyczyną w moim przypadku było:

  1. utworzyłem kopię zapasową bazy danych przez phpmyadmin kopiując całą bazę danych.
  2. utworzyłem nowy db o tej samej nazwie, co Stary db.
  3. uruchomiłem skrypt SQL do tworzenia zaktualizowanych tabel i danych.
  4. Mam błąd. Również, gdy wyłączyłem foreign_key_checks. Ale baza danych była całkowicie pusta.

Powodem było: ponieważ używałem phpmyadmin do tworzenia kluczy obcych w przemianowana baza danych - klucze obce, w których utworzono prefiks nazwy bazy danych, ale prefiks nazwy bazy danych nie został zaktualizowany. Tak więc w backup-db nadal były odniesienia wskazujące na nowo utworzony db.

 0
Author: lsblsb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-22 11:08:17

Moje rozwiązanie jest może trochę żenujące i opowiada o tym, dlaczego warto czasem spojrzeć na to, co masz przed sobą zamiast tych postów:)

Miałem uruchomiony do przodu inżynier wcześniej, co nie powiodło się, więc oznaczało to, że moja baza danych już kilka tabel, a następnie siedziałem próbując naprawić błędy kontrargumentów klucza obcego starając się upewnić, że wszystko było idealne, ale pobiegł przeciwko tabel wcześniej utworzonych, więc nie było przeważać.

 0
Author: DenLilleMand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-16 16:30:43

Sprawdź podpis na obu kolumnach tabeli. Jeśli kolumna tabeli odniesienia jest podpisana, kolumna tabeli odniesienia również powinna być podpisana.

 0
Author: katwekibs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-23 08:34:24

Jedną z dodatkowych przyczyn tego błędu jest to, że tabele lub kolumny zawierają zarezerwowane Słowa kluczowe :

Czasami o nich zapomina się.

 0
Author: EssGee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-07 13:11:25

W moim przypadku wystąpił błąd składni, który nie został wyraźnie zgłoszony przez konsolę MySQL po uruchomieniu zapytania. Jednak SHOW ENGINE INNODB STATUS LATEST FOREIGN KEY ERROR Sekcja

  Syntax error close to:

  REFERENCES`role`(`id`) ON DELETE CASCADE) ENGINE = InnoDB DEFAULT CHARSET = utf8

Musiałem zostawić spację pomiędzy REFERENCES i role Aby to zadziałało.

 0
Author: vicke4,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-29 22:04:12

Miałem ten sam problem, potem poprawiłem nazwę silnika jako Innodb w obu tabelach nadrzędnych i podrzędnych oraz poprawiłem nazwę pola odniesienia KLUCZ OBCY (c_id)x9o_parent_table(c_id)
następnie działa dobrze, a tabele są poprawnie zainstalowane. To będzie pełne wykorzystanie dla kogoś.

 -1
Author: subramanian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 10:18:43