Jadi saya mencoba untuk menambahkan batasan Foreign Key ke database saya sebagai persyaratan proyek dan itu bekerja pertama atau dua kali pada tabel yang berbeda, tapi saya punya dua tabel yang saya dapatkan kesalahan ketika mencoba menambahkan batasan kunci asing. Pesan kesalahan yang saya dapatkan adalah:
GALAT 1215 (HY000): Tidak dapat menambahkan batasan kunci asing
Ini adalah SQL yang saya gunakan untuk membuat tabel, dua tabel yang menyinggung adalah Patient
dan 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;
sumber
set null
menghapus, tetapi kolom itunot null
.Saya telah menetapkan satu bidang sebagai "Tidak Ditandatangani" dan yang lainnya tidak. Setelah saya atur kedua kolom ke Unsigned itu berfungsi.
sumber
: Bahkan jika tabel Anda memiliki Collation yang sama, kolom masih bisa memiliki yang berbeda.
sumber
unique
ke kolom tabel referensi meskipun itu adalahPrimary Key
!!Cobalah untuk menggunakan jenis kunci utama yang sama - int (11) - pada kunci asing - smallint (5) - juga.
Semoga ini bisa membantu!
sumber
Konfirmasikan bahwa pengkodean dan pengumpulan karakter untuk dua tabel adalah sama.
Dalam kasus saya sendiri, salah satu tabel menggunakan
utf8
dan yang lainnya menggunakanlatin1
.Saya punya kasus lain di mana penyandiannya sama tetapi susunannya berbeda. Satu
utf8_general_ci
lainutf8_unicode_ci
Anda dapat menjalankan perintah ini untuk mengatur penyandian dan susunan tabel.
Saya harap ini membantu seseorang.
sumber
Untuk mengatur KUNCI ASING di Tabel B Anda harus menetapkan KUNCI di tabel A.
Dalam tabel A: INDEX
id
(id
)Dan kemudian di tabel B,
sumber
Saya memiliki masalah yang sama dan solusinya sangat sederhana. Solusi: kunci asing yang dideklarasikan dalam tabel tidak boleh diatur menjadi tidak nol.
referensi: Jika Anda menentukan tindakan SET NULL, pastikan Anda belum mendeklarasikan kolom dalam tabel anak sebagai BUKAN NULL. ( ref )
sumber
Periksa aturan berikut:
Pertama, periksa apakah nama diberikan hak untuk nama tabel
Jenis data kanan kedua berikan ke kunci asing?
sumber
Harap pastikan bahwa kedua tabel berada dalam format InnoDB. Bahkan jika seseorang berada dalam format MyISAM, maka, batasan kunci asing tidak akan berfungsi.
Juga, hal lain adalah bahwa kedua bidang harus dari jenis yang sama. Jika satu adalah INT, maka yang lain juga harus INT. Jika satu adalah VARCHAR, yang lain juga harus VARCHAR, dll.
sumber
Saya menghadapi masalah ini dan dapat menyelesaikannya dengan memastikan bahwa tipe data benar-benar cocok.
Saya menggunakan SequelPro untuk menambahkan kendala dan itu membuat kunci utama tidak ditandai sebagai default.
sumber
Periksa penandatanganan di kedua kolom tabel Anda. Jika kolom tabel rujukan DITANDATANGANI, kolom tabel referensi juga harus DITANDATANGANI.
sumber
Bagi saya, masalahnya adalah, tabel orangtua saya memiliki set karakter yang berbeda dari yang saya buat.
Parent Table (PRODUK)
Tabel Anak yang memiliki masalah (PRICE_LOGS)
DIUBAH UNTUK
sumber
Masalah saya adalah bahwa saya mencoba membuat tabel relasi sebelum tabel lain!
sumber
SET foreign_key_checks = 0;
Saya memiliki kesalahan serupa dalam membuat kunci asing di tabel Banyak ke Banyak di mana kunci utama terdiri dari 2 kunci asing dan kolom normal lainnya. Saya memperbaiki masalah ini dengan memperbaiki nama tabel yang direferensikan yaitu perusahaan, seperti yang ditunjukkan dalam kode yang diperbaiki di bawah ini:
sumber
Saya memiliki kesalahan yang sama dengan dua kunci asing untuk tabel yang berbeda tetapi dengan nama kunci yang sama! Saya telah mengganti nama kunci dan kesalahan telah hilang)
sumber
Punya kesalahan yang sama, tetapi dalam kasus saya saya tidak ada untuk menyatakan pk sebagai auto_increment.
Kalau-kalau itu bisa bermanfaat bagi siapa pun
sumber
Saya mendapat kesalahan yang sama. Penyebab dalam kasus saya adalah:
Penyebabnya adalah: Karena saya menggunakan phpmyadmin untuk membuat beberapa kunci asing di database yang diubah namanya - kunci asing di mana dibuat dengan awalan nama basis data tetapi awalan nama basis data tidak diperbarui. Jadi masih ada referensi di backup-db yang menunjuk ke db yang baru dibuat.
sumber
Solusi saya mungkin sedikit memalukan dan menceritakan kisah mengapa Anda kadang-kadang harus melihat apa yang ada di depan Anda alih-alih pos-pos ini :)
Saya telah menjalankan seorang insinyur maju sebelumnya, yang gagal, sehingga itu berarti bahwa database saya sudah memiliki beberapa tabel, maka saya telah duduk berusaha untuk memperbaiki kegagalan kunci asing yang berusaha memastikan bahwa semuanya sempurna, tetapi berlari melawan tabel yang sebelumnya dibuat, jadi tidak ada yang menang.
sumber
Salah satu penyebab tambahan kesalahan ini adalah ketika tabel atau kolom Anda berisi kata kunci yang dipesan :
Terkadang orang melupakan ini.
sumber
Dalam kasus saya, ada kesalahan sintaksis yang tidak diberitahukan secara eksplisit oleh konsol MySQL saat menjalankan kueri. Namun, bagian
SHOW ENGINE INNODB STATUS
perintahLATEST FOREIGN KEY ERROR
melaporkan,Saya harus meninggalkan ruang kosong di antara
REFERENCES
danrole
untuk membuatnya bekerja.sumber
Bagi saya itu - Anda tidak bisa menghilangkan awalan tabel DB saat ini jika Anda membuat FK untuk DB tidak lancar referensi DB saat ini:
Jika saya menghilangkan "currrent_db." untuk tabel pengguna, saya mendapatkan kesalahan FK. Menarik bahwa MENUNJUKKAN STATUS ENGINE INNODB; tidak menunjukkan apa pun dalam hal ini.
sumber
Saya memiliki masalah yang sama kemudian saya mengoreksi nama Mesin sebagai Innodb di kedua tabel induk dan anak dan mengoreksi nama bidang referensi KUNCI LUAR NEGERI (
c_id
) REFERENSIx9o_parent_table
(c_id
)kemudian berfungsi dengan baik dan tabel diinstal dengan benar. Ini akan digunakan penuh untuk seseorang.
sumber