Lebih
MySQL Error 1215: Tidak dapat menambahkan foreign key constraint
Saya mencoba untuk maju engineer baru saya skema ke db server, tapi aku bisa't tahu mengapa saya mendapatkan error ini. I've mencoba untuk mencari jawabannya di sini, tapi semuanya saya've ditemukan telah mengatakan untuk mengatur db engine Innodb atau untuk memastikan kunci I'm berusaha untuk digunakan sebagai foreign key adalah primary key pada tabel mereka sendiri. Saya telah melakukan kedua hal ini, jika saya'm tidak keliru. Bantuan lain yang bisa kalian tawarkan?
Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
`Clients_Case_Number` INT NOT NULL ,
`Staff_Emp_ID` INT NOT NULL ,
PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
CONSTRAINT `fk_Clients_has_Staff_Clients`
FOREIGN KEY (`Clients_Case_Number` )
REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Clients_has_Staff_Staff1`
FOREIGN KEY (`Staff_Emp_ID` )
REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
SQL script eksekusi selesai: laporan: 7 berhasil, gagal 1
Berikut ini adalah SQL untuk tabel induk.
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
`Case_Number` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
`Address` CHAR(50) NULL ,
`Phone_Number` INT(10) NULL ,
PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB
CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
`Emp_ID` INT NOT NULL ,
`First_Name` CHAR(10) NULL ,
`Middle_Name` CHAR(10) NULL ,
`Last_Name` CHAR(10) NULL ,
PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB
313
30
I'm menebak bahwa
Klien.Case_Number
dan/atauStaf.Emp_ID
tidak benar-benar tipe data yang sama sebagaiClients_has_Staff.Clients_Case_Number
danClients_has_Staff.Staff_Emp_ID
.Mungkin kolom dalam tabel induk adalah
INT UNSIGNED
?Mereka harus persis tipe data yang sama di kedua tabel.
Alasan anda mungkin mendapatkan foreign key constraint kesalahan:
Update:
ON DELETE SET NULL
tidak didefinisikan untuk menjadi null. Jadi pastikan bahwa kolom set default null.Check ini.
Bagi orang lain kesalahan yang sama mungkin tidak selalu karena kolom type mismatch, anda dapat mengetahui informasi lebih lanjut tentang mysql foriegn key kesalahan dengan mengeluarkan perintah
anda mungkin menemukan kesalahan di dekat bagian atas pesan yang dicetak sesuatu seperti
Kesalahan 1215 adalah salah satu yang menjengkelkan. Ledakan Pil's jawaban mencakup dasar-dasar. Anda ingin pastikan untuk memulai dari sana. Namun, ada lebih banyak kasus yang lebih halus untuk melihat keluar untuk:
Misalnya, ketika anda mencoba untuk menghubungkan Kunci PRIMER dari tabel yang berbeda, pastikan untuk memberikan yang tepat
UPDATE
danDELETE
pilihan. E. g.:won't terbang, karena Kunci PRIMER (seperti
id
) dapat'tNULL
.Saya yakin, bahkan ada yang lebih, demikian pula isu halus ketika menambahkan semacam ini kendala, yang adalah mengapa ketika menemui kendala kesalahan, selalu pastikan bahwa kendala dan implikasi yang masuk akal dalam konteks anda saat ini. Good luck dengan kesalahan 1215!
Cek pemeriksaan tabel, menggunakan
SHOW TABLE STATUS
anda dapat memeriksa informasi tentang tabel, termasuk pemeriksaan.Kedua tabel harus memiliki pemeriksaan yang sama.
It's terjadi padaku.
Dalam kasus saya, saya telah menghapus sebuah tabel menggunakan
SET FOREIGN_KEY_CHECKS=0
, kemudianSET FOREIGN_KEY_CHECKS=1
setelah. Ketika saya pergi untuk reload meja, aku punyakesalahan 1215
. Masalahnya adalah ada satu tabel dalam database yang memiliki foreign key ke meja saya telah dihapus dan reload. Bagian dari reload proses yang terlibat mengubah tipe data untuk satu bidang, yang membuat foreign key dari tabel yang lain yang tidak valid, sehingga memicukesalahan 1215
. Aku memecahkan masalah dengan menjatuhkan dan kemudian reload lainnya tabel dengan tipe data baru untuk terlibat lapangan.Ada kesalahan yang telah saya alami dengan "Kesalahan 1215: Tidak dapat menambahkan foreign key constraint" ketika menggunakan Laravel 4, terutama dengan JeffreyWay's Laravel 4 Generator.
Di Laravel 4, anda dapat menggunakan JeffreyWay's Generator untuk menghasilkan file migrasi untuk membuat tabel satu-per-satu, yang berarti, masing-masing file migrasi menghasilkan satu meja. Anda harus menyadari fakta bahwa setiap migrasi file yang dihasilkan dengan timestamp dalam nama file, yang memberikan file order. Urutan generasi ini juga urutan operasi migrasi ketika anda api Tukang CLI command "php artisan migrate". Jadi, jika file yang meminta constraint foreign key yang mengacu pada kunci yang akan, tapi belum, yang dihasilkan dalam kedua file, Kesalahan 1215 dipecat. Dalam kasus seperti ini, apa yang harus anda lakukan adalah mengatur urutan file migrasi generasi. Menghasilkan file baru dalam urutan yang tepat, copy-dalam konten, kemudian menghapus teratur file lama.
Aku punya kesalahan yang sama ketika mencoba untuk menambahkan fk. Dalam kasus saya, masalah itu disebabkan oleh FK tabel's PK yang ditandai sebagai unsigned.
saya memiliki masalah yang sama, solusi saya:
Sebelumnya:
Solusi:
Saya berharap itu's membantu ;)
Aku punya masalah yang sama. Aku soal itu melakukan hal ini:
Saya membuat baris berikut
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)
Saya menemukan solusi ini setelah mencoba untuk mengimpor tabel dalam skema pembangun. Jika bekerja untuk anda, biarkan aku tahu!
Good luck!
Felipe Tércio
Periksa tabel kompatibilitas. Misalnya, jika salah satu meja adalah
MyISAM
dan yang lainnya adalahInnoDB
, anda mungkin memiliki masalah ini.Alasan lain: jika anda menggunakan
ON DELETE SET NULL
semua kolom yang digunakan dalam foreign key harus memungkinkan nilai null. Orang lain menemukan hal ini di pertanyaan.Dari pemahaman saya itu tidak't menjadi masalah mengenai integritas data, tetapi tampaknya bahwa MySQL hanya doesn't mendukung fitur ini (dalam 5.7).
Saya tidak dapat menemukan kesalahan ini
Saya hanya ingin menambahkan hal ini juga untuk
VARCHAR
foreign key relasi. Saya menghabiskan minggu terakhir mencoba untuk mencari tahu ini di MySQL Workbench 8.0 dan akhirnya dapat memperbaiki kesalahan.Jawaban Singkat: Set karakter dan pemeriksaan skema, tabel, kolom, tabel referensi, referensi kolom dan setiap tabel lain yang merujuk ke tabel orangtua harus cocok.
Jawaban Panjang: Saya telah ENUM datatype di meja saya. Aku berubah ini untuk
VARCHAR
dan saya bisa mendapatkan nilai-nilai dari sebuah tabel referensi sehingga saya don't harus mengubah tabel orangtua untuk menambahkan opsi tambahan. Ini asing-kunci hubungan yang tampak sederhana tapi aku punya 1215 kesalahan. arvind's jawaban dan berikut ini link mengusulkan penggunaanMenggunakan perintah ini aku punya berikut verbose deskripsi untuk kesalahan dengan tidak ada tambahan informasi bermanfaat
Setelah saya menggunakan
SET FOREIGN_KEY_CHECKS=0;
seperti yang disarankan oleh Arvind Bharadwaj dan link disini:Ini memberi pesan galat berikut:
Pada titik ini, saya 'merekayasa'-ed skema dan saya mampu untuk membuat foreign key hubungan di EER diagram. Pada 'maju engineer'-ing, saya mendapat error berikut:
Ketika saya 'maju engineer'-ed EER diagram skema baru, SQL script berlari tanpa masalah. Pada membandingkan SQL yang dihasilkan dari upaya untuk maju insinyur, saya menemukan bahwa perbedaan adalah set karakter dan pemeriksaan. Tabel orangtua, anak meja dan dua kolom yang telah
utf8mb4
set karakter danutf8mb4_0900_ai_ci
pemeriksaan, namun, kolom lain dalam tabel orangtua direferensikan menggunakanSET KARAKTER = utf8 , COLLATE = utf8_bin ;
untuk anak yang berbeda meja.Untuk seluruh skema, saya mengubah set karakter dan pemeriksaan untuk semua tabel dan semua kolom berikut:
Ini akhirnya memecahkan masalah saya dengan 1215 kesalahan.
Catatan: Pemeriksaan
utf8mb4_general_ci
bekerja di MySQL Workbench 5.0 atau yang lebih baru. Pemeriksaanutf8mb4_0900_ai_ci
bekerja hanya untuk MySQL Workbench 8.0 atau lebih tinggi. Saya percaya salah satu alasan saya memiliki masalah dengan set karakter dan pemeriksaan adalah karena MySQL Workbench upgrade ke 8.0 di antara. Berikut adalah link bahwa pembicaraan lebih lanjut tentang hal ini pemeriksaan.Hal ini juga terjadi ketika jenis kolom yang tidak sama.
misalnya jika kolom yang anda maksud adalah UNSIGNED INT dan kolom yang dimaksud adalah INT maka anda mendapatkan kesalahan ini.
Untuk MySQL (INNODB) ... dapatkan definisi untuk kolom yang ingin anda link
membandingkan dan memverifikasi kedua kolom tersebut harus
bisa membantu untuk bermain seperti
Bagi saya itu adalah jenis kolom. BigINT != INT.
Tapi kemudian itu masih tidak't bekerja.
Jadi aku memeriksa mesin. Pastikan Table1 = InnoDB dan Tabel = InnoDB
Saya mengalami kesalahan ini untuk alasan yang sama sekali berbeda. Saya menggunakan MySQL Workbench 6.3 untuk menciptakan Model Data (alat yang mengagumkan). Saya melihat bahwa ketika kolom order didefinisikan dalam Foreign Key constraint definisi tidak sesuai dengan kolom tabel urutan kesalahan ini juga dihasilkan.
Butuh waktu sekitar 4 jam untuk mencoba segala sesuatu yang lain tapi pemeriksaan itu.
Sekarang semua bekerja dengan baik dan saya bisa kembali ke coding. :-)
Ketika kesalahan ini terjadi karena tabel direferensikan menggunakan engine MyISAM jawaban ini menyediakan cara cepat untuk mengkonversi database anda sehingga semua Django model meja menggunakan InnoDB: https://stackoverflow.com/a/15389961/2950621
It's Django manajemen perintah yang disebut convert_to_innodb.
Wooo aku hanya punya itu ! Ini adalah campuran dari banyak sudah diposting jawaban (innoDB, unsigned, dll). Satu hal yang saya didn't melihat di sini adalah : jika anda FK menunjuk pada PK, memastikan sumber kolom memiliki nilai yang masuk akal. Misalnya, jika PK adalah mediumint(8), pastikan kolom sumber juga mengandung mediumint(8). Itu adalah bagian dari masalah untuk saya.