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
Mengomentari pertanyaan (5)
Larutan

I'm menebak bahwa Klien.Case_Number dan/atau Staf.Emp_ID tidak benar-benar tipe data yang sama sebagai Clients_has_Staff.Clients_Case_Number dan Clients_has_Staff.Staff_Emp_ID.

Mungkin kolom dalam tabel induk adalah INT UNSIGNED?

Mereka harus persis tipe data yang sama di kedua tabel.

Komentar (11)

Alasan anda mungkin mendapatkan foreign key constraint kesalahan:

  1. Anda tidak menggunakan InnoDB sebagai mesin pada semua tabel.
  2. Anda mencoba untuk referensi tidak ada key pada tabel target. Pastikan itu adalah kunci pada tabel lain (hal ini dapat primer atau kunci unik)
  3. Jenis-jenis kolom yang tidak sama (pengecualian adalah kolom pada tabel referensi yang dapat nullable).
  4. Jika PK/FK adalah varchar pastikan pemeriksaan adalah sama untuk keduanya.

Update:

  1. Salah satu alasan mungkin juga bahwa kolom yang anda gunakan untuk ON DELETE SET NULL tidak didefinisikan untuk menjadi null. Jadi pastikan bahwa kolom set default null.

Check ini.

Komentar (12)

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

SHOW ENGINE INNODB STATUS;

anda mungkin menemukan kesalahan di dekat bagian atas pesan yang dicetak sesuatu seperti

Tidak dapat menemukan indeks dalam tabel direferensikan mana direferensikan muncul kolom pertama kolom, atau jenis kolom dalam tabel dan tabel direferensikan tidak cocok untuk kendala.

Komentar (4)

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 dan DELETE pilihan. E. g.:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

won't terbang, karena Kunci PRIMER (seperti id) dapat't NULL.

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!

Komentar (3)

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.

Komentar (1)

Dalam kasus saya, saya telah menghapus sebuah tabel menggunakan SET FOREIGN_KEY_CHECKS=0, kemudian SET FOREIGN_KEY_CHECKS=1 setelah. Ketika saya pergi untuk reload meja, aku punya kesalahan 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 memicu kesalahan 1215. Aku memecahkan masalah dengan menjatuhkan dan kemudian reload lainnya tabel dengan tipe data baru untuk terlibat lapangan.

Komentar (0)

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.

Komentar (0)

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.

Komentar (0)

saya memiliki masalah yang sama, solusi saya:

Sebelumnya:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Solusi:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Saya berharap itu's membantu ;)

Komentar (1)

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

Komentar (0)

Periksa tabel kompatibilitas. Misalnya, jika salah satu meja adalah MyISAM dan yang lainnya adalah InnoDB, anda mungkin memiliki masalah ini.

Komentar (0)

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).

Komentar (0)

Saya tidak dapat menemukan kesalahan ini

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)
Komentar (0)

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 penggunaan

SHOW ENGINE INNODB STATUS;

Menggunakan perintah ini aku punya berikut verbose deskripsi untuk kesalahan dengan tidak ada tambahan informasi bermanfaat

Tidak dapat menemukan indeks dalam tabel direferensikan mana direferensikan muncul kolom pertama kolom, atau jenis kolom dalam tabel dan tabel direferensikan tidak cocok untuk kendala. Perhatikan bahwa penyimpanan internal tipe ENUM dan SET berubah di tabel dibuat dengan >= InnoDB-4.1.12, dan kolom seperti pada tabel tua tidak dapat direferensikan oleh kolom seperti pada tabel baru. Silahkan lihat http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html untuk benar foreign key definisi.

Setelah saya menggunakan SET FOREIGN_KEY_CHECKS=0; seperti yang disarankan oleh Arvind Bharadwaj dan link disini:

Ini memberi pesan galat berikut:

Kode Kesalahan: 1822. Gagal untuk menambahkan foreign key constraint. Hilang indeks untuk kendala

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:

Kesalahan 1452: Tidak dapat menambahkan atau memperbarui anak row: a foreign key constraint gagal

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 dan utf8mb4_0900_ai_ci pemeriksaan, namun, kolom lain dalam tabel orangtua direferensikan menggunakan SET 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:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Ini akhirnya memecahkan masalah saya dengan 1215 kesalahan.

Catatan: Pemeriksaan utf8mb4_general_ci bekerja di MySQL Workbench 5.0 atau yang lebih baru. Pemeriksaan utf8mb4_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.

Komentar (0)

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.

Komentar (0)

Untuk MySQL (INNODB) ... dapatkan definisi untuk kolom yang ingin anda link

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

membandingkan dan memverifikasi kedua kolom tersebut harus

sama COLUMN_TYPE(panjang), sama COLATION

bisa membantu untuk bermain seperti

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;
Komentar (0)

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

Komentar (0)

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. :-)

Komentar (2)

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.

Komentar (0)

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.

Komentar (0)