Saya mencoba untuk meneruskan skema baru saya ke server db saya, tetapi saya tidak tahu mengapa saya mendapatkan kesalahan ini. Saya sudah mencoba mencari jawabannya di sini, tetapi semua yang saya temukan mengatakan bahwa mengatur mesin db ke Innodb atau untuk memastikan kunci yang saya coba gunakan sebagai kunci asing adalah kunci utama di tabel mereka sendiri. . Saya telah melakukan kedua hal ini, jika saya tidak salah. Ada 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
Eksekusi skrip SQL selesai: pernyataan: 7 berhasil, 1 gagal
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
mysql
foreign-keys
Robert B
sumber
sumber
Clients
danStaff
.Jawaban:
Saya menduga itu
Clients.Case_Number
dan / atauStaff.Emp_ID
bukan tipe data yang sama persis denganClients_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.
sumber
Table
CHARACTER SET = utf8; dan ALTER TABLEDevice
CHANGE COLUMNID
ID
CHAR (36) CHARACTER SET 'utf8' NOT NULL;Alasan Anda mungkin mendapatkan kesalahan batasan kunci asing:
Memperbarui:
ON DELETE SET NULL
tidak didefinisikan sebagai nol. Jadi, pastikan kolomnya disetel nol default.Lihat ini.
sumber
Untuk yang lain, kesalahan yang sama mungkin tidak selalu disebabkan oleh ketidakcocokan jenis kolom, Anda dapat menemukan informasi lebih lanjut tentang kesalahan kunci mysql foriegn dengan mengeluarkan perintah
Anda mungkin menemukan kesalahan di dekat bagian atas pesan yang dicetak seperti
sumber
Kesalahan 1215 adalah yang menjengkelkan. Jawaban Pill Explosion mencakup dasar-dasarnya. Anda ingin memastikan mulai dari sana. Namun, ada lebih banyak, lebih banyak kasus halus yang harus diwaspadai:
Misalnya, ketika Anda mencoba menautkan KUNCI UTAMA dari tabel yang berbeda, pastikan untuk memberikan opsi yang tepat
ON UPDATE
danON DELETE
. Misalnya:tidak akan terbang, karena KUNCI UTAMA (seperti
id
) tidak bisaNULL
.Saya yakin, ada lebih banyak lagi, masalah yang sama halusnya ketika menambahkan kendala semacam ini, itulah sebabnya ketika menemukan kesalahan kendala, selalu memastikan bahwa kendala dan implikasinya masuk akal dalam konteks Anda saat ini. Semoga berhasil dengan kesalahan Anda 1215!
sumber
ON DELETE SET NULL
pada kolom yang saya inginkanNOT NULL
. Misalkan Anda tidak dapat memiliki kue dan memakannya juga.Periksa susunan tabel, menggunakan
SHOW TABLE STATUS
Anda dapat memeriksa informasi tentang tabel, termasuk susunan tersebut.Kedua tabel harus memiliki susunan yang sama.
Itu terjadi pada saya.
sumber
Dalam kasus saya, saya telah menghapus tabel menggunakan
SET FOREIGN_KEY_CHECKS=0
, laluSET FOREIGN_KEY_CHECKS=1
sesudahnya. Ketika saya pergi untuk memuat ulang tabel, saya dapaterror 1215
. Masalahnya adalah ada tabel lain dalam database yang memiliki kunci asing ke tabel yang telah saya hapus dan reload. Bagian dari proses reload melibatkan perubahan tipe data untuk salah satu bidang, yang membuat kunci asing dari tabel lain tidak valid, sehingga memicuerror 1215
. Saya menyelesaikan masalah dengan menjatuhkan dan kemudian memuat kembali tabel lainnya dengan tipe data baru untuk bidang yang terlibat.sumber
Saya mendapat kesalahan yang sama ketika mencoba menambahkan fk. Dalam kasus saya, masalahnya disebabkan oleh PK tabel FK yang ditandai sebagai tidak ditandatangani.
sumber
Ada jebakan yang saya alami dengan "Kesalahan 1215: Tidak dapat menambahkan batasan kunci asing" saat menggunakan Laravel 4, terutama dengan Laravel 4 Generator milik JeffreyWay.
Di Laravel 4, Anda bisa menggunakan Generator JeffreyWay untuk membuat file migrasi untuk membuat tabel satu per satu, yang berarti, setiap file migrasi menghasilkan satu tabel. Anda harus mengetahui fakta bahwa setiap file migrasi dibuat dengan stempel waktu dalam nama file, yang memberikan urutan file. Urutan pembangkitan juga merupakan urutan operasi migrasi ketika Anda memecat perintah Artisan CLI "php artisan migrate". Jadi, jika file meminta batasan kunci asing mengacu pada kunci yang akan, tetapi belum, dihasilkan dalam file yang terakhir, Kesalahan 1215 dipecat. Dalam kasus seperti itu, apa yang harus Anda lakukan adalah menyesuaikan urutan pembuatan file migrasi. Hasilkan file baru dalam urutan yang tepat, salin dalam konten, lalu hapus file lama yang tidak teratur.
sumber
saya punya masalah yang sama, solusi saya:
Sebelum:
Larutan:
Saya harap ini membantu;)
sumber
Saya memiliki masalah yang sama.
Saya menyelesaikannya dengan melakukan ini:
Saya membuat baris berikut di
primary key: (id int(11) unsigned NOT NULL AUTO_INCREMENT)
Saya menemukan solusi ini setelah mencoba mengimpor tabel di pembuat skema saya. Jika itu berhasil untuk Anda, beri tahu saya!
Semoga berhasil!
Felipe Tércio
sumber
Saya hanya ingin menambahkan kasus ini juga untuk
VARCHAR
hubungan kunci asing. Saya menghabiskan minggu terakhir mencoba mencari tahu ini di MySQL Workbench 8.0 dan akhirnya bisa memperbaiki kesalahan.Jawaban Singkat: Kumpulan karakter dan susunan skema, tabel, kolom, tabel referensi, kolom referensi dan tabel lain yang merujuk ke tabel induk harus cocok.
Jawaban Panjang: Saya memiliki tipe data ENUM di meja saya. Saya mengubah ini menjadi
VARCHAR
dan saya bisa mendapatkan nilai dari tabel referensi sehingga saya tidak perlu mengubah tabel induk untuk menambahkan opsi tambahan. Hubungan asing-kunci ini tampak langsung tetapi saya mendapatkan 1.215 kesalahan. Jawaban arvind dan tautan berikut menyarankan penggunaanSaat menggunakan perintah ini saya mendapatkan deskripsi verbose berikut untuk kesalahan tanpa informasi bermanfaat tambahan
Setelah itu saya gunakan
SET FOREIGN_KEY_CHECKS=0;
seperti yang disarankan oleh Arvind Bharadwaj dan tautannya di sini :Ini memberi pesan kesalahan berikut:
Pada titik ini, saya 'membalikkan rekayasa' pada skema tersebut dan saya dapat membuat hubungan kunci-asing dalam diagram EER. Pada 'forward engineer'-ing, saya mendapatkan kesalahan berikut:
Ketika saya 'meneruskan insinyur' -ed diagram EER ke skema baru, skrip SQL berjalan tanpa masalah. Pada membandingkan SQL yang dihasilkan dari upaya untuk meneruskan insinyur, saya menemukan bahwa perbedaannya adalah set karakter dan susunan. Tabel induk, tabel anak dan dua kolom memiliki
utf8mb4
set karakter danutf8mb4_0900_ai_ci
pemeriksaan, namun, kolom lain dalam tabel induk dirujuk menggunakanCHARACTER SET = utf8 , COLLATE = utf8_bin ;
tabel anak yang berbeda.Untuk keseluruhan skema, saya mengubah set karakter dan susunan untuk semua tabel dan semua kolom menjadi sebagai berikut:
Ini akhirnya menyelesaikan masalah saya dengan kesalahan 1215.
Catatan Sisi: Susunan
utf8mb4_general_ci
berfungsi di MySQL Workbench 5.0 atau lebih baru. Collationutf8mb4_0900_ai_ci
hanya berfungsi untuk MySQL Workbench 8.0 atau lebih tinggi. Saya percaya salah satu alasan saya memiliki masalah dengan set karakter dan collation adalah karena upgrade MySQL Workbench ke 8.0 di antaranya. Berikut ini tautan yang membicarakan lebih lanjut tentang susunan ini.sumber
Saya tidak dapat menemukan kesalahan ini
sumber
Ini juga terjadi ketika jenis kolom tidak sama.
mis. jika kolom yang Anda tuju adalah UNSIGNED INT dan kolom yang dimaksud adalah INT maka Anda mendapatkan kesalahan ini.
sumber
Untuk MySQL (INNODB) ... dapatkan definisi untuk kolom yang ingin Anda tautkan
bandingkan dan verifikasi kedua definisi kolom miliki
bisa membantu bermain seperti
sumber
Periksa kompatibilitas tabel. Misalnya, jika satu tabel
MyISAM
dan yang lain adalahInnoDB
, Anda mungkin memiliki masalah ini.sumber
Alasan lain: jika Anda menggunakan
ON DELETE SET NULL
semua kolom yang digunakan pada kunci asing harus mengizinkan nilai nol. Orang lain menemukan ini dalam pertanyaan ini .Dari pemahaman saya itu tidak akan menjadi masalah mengenai integritas data, tetapi tampaknya MySQL tidak mendukung fitur ini (dalam 5.7).
sumber
Ketika kesalahan ini terjadi karena tabel yang direferensikan menggunakan mesin MyISAM jawaban ini menyediakan cara cepat untuk mengkonversi database Anda sehingga semua tabel model Django menggunakan InnoDB: https://stackoverflow.com/a/15389961/2950621
Ini adalah perintah manajemen Django yang disebut convert_to_innodb.
sumber
Wooo saya baru saja mendapatkannya! Itu adalah campuran dari banyak jawaban yang sudah diposting (innoDB, unsigned, dll). Satu hal yang saya tidak lihat di sini adalah: jika FK Anda menunjuk pada PK, pastikan kolom sumber memiliki nilai yang masuk akal. Misalnya, jika PK adalah mediumint (8), pastikan kolom sumber juga mengandung mediumint (8). Itu adalah bagian dari masalah bagi saya.
sumber
Bagi saya itu adalah jenis kolom. BigINT! = INT.
Tapi itu tetap tidak berhasil.
Jadi saya memeriksa mesinnya. Pastikan Table1 = InnoDB dan Table = InnoDB
sumber
Saya mengalami kesalahan ini karena alasan yang sangat berbeda. Saya menggunakan MySQL Workbench 6.3 untuk membuat Model Data saya (alat yang luar biasa). Saya perhatikan bahwa ketika urutan kolom yang didefinisikan dalam definisi batasan kunci asing tidak cocok dengan urutan kolom tabel kesalahan ini juga dihasilkan.
Butuh waktu sekitar 4 jam untuk mencoba yang lain selain memeriksa itu.
Sekarang semuanya bekerja dengan baik dan saya bisa kembali ke pengkodean. :-)
sumber
ketika mencoba membuat kunci asing saat menggunakan migrasi laravel
seperti contoh ini:
tabel pengguna
tabel warna
terkadang properti tidak berfungsi
kesalahan ini terjadi karena kunci asing (tipe) di [tabel pengguna] berbeda dari kunci primer (tipe) di [tabel warna]
Untuk mengatasi masalah ini harus mengubah kunci utama dalam [tabel warna]
$table->tinyIncrements('id');
Saat Anda menggunakan kunci utama
$table->Increments('id');
Anda harus menggunakan
Integer
sebagai kunci asingSaat Anda menggunakan kunci utama
$table->tinyIncrements('id');
Anda harus menggunakan
unsignedTinyInteger
sebagai kunci asingSaat Anda menggunakan kunci utama
$table->smallIncrements('id');
kamu harus menggunakan
unsignedSmallInteger
sebagai kunci asingSaat Anda menggunakan kunci utama
$table->mediumIncrements('id');
Anda harus menggunakan
unsignedMediumInteger
sebagai kunci asingsumber
bigIncrements
sebagai kunci utama, jadi saya harus menggunakanunsignedBigInteger
Dalam kasus saya, saya harus menonaktifkan
FOREIGN KEY
pemeriksaan karena tabel sumber tidak ada.SET FOREIGN_KEY_CHECKS=0;
sumber
Waspadai penggunaan backquotes juga. Saya memiliki dalam naskah pernyataan berikut ini
tetapi backquotes pada akhirnya salah. Seharusnya:
MySQL tidak memberikan rincian tentang kesalahan ini ...
sumber
Sumber lain kesalahan ini adalah bahwa Anda memiliki 2 atau lebih nama tabel yang sama yang memiliki nama kunci asing yang sama. Ini kadang-kadang terjadi pada orang-orang yang menggunakan perangkat lunak pemodelan dan desain, seperti Mysql Workbench, dan kemudian menghasilkan skrip dari desain.
sumber
Saya tahu saya SANGAT terlambat ke pesta tetapi saya ingin menaruhnya di sini sehingga terdaftar.
Serta semua saran di atas untuk memastikan bahwa bidang didefinisikan secara identik, dan tipe tabel juga memiliki susunan yang sama, pastikan bahwa Anda tidak membuat kesalahan pemula dalam mencoba menautkan bidang yang datanya di bidang CHILD tidak. sudah ada di kolom PARENT. Jika Anda memiliki data yang ada di bidang CHILD yang belum Anda masukkan ke bidang PARENT maka itu akan menyebabkan kesalahan ini. Sayang sekali pesan kesalahannya tidak terlalu membantu.
Jika Anda tidak yakin, cadangan tabel yang memiliki Kunci Asing, hapus semua data, lalu coba buat Kunci Asing. Jika berhasil maka apa yang harus Anda lakukan!
Semoga berhasil.
sumber
Ini adalah versi halus dari apa yang telah dikatakan, tetapi dalam contoh saya, saya memiliki 2 database (foo and bar). Saya buat foo dulu dan saya tidak menyadarinya mereferensikan kunci asing di bar.baz (yang belum dibuat). Ketika saya mencoba membuat bar.baz (tanpa kunci asing), saya terus mendapatkan kesalahan ini. Setelah melihat-lihat sebentar saya menemukan kunci asing di foo.
Jadi, singkatnya, Jika Anda mendapatkan kesalahan ini, Anda mungkin memiliki kunci asing yang sudah ada ke tabel yang sedang dibuat.
sumber
Bagi saya, kesalahan 1215 terjadi ketika saya mengimpor dumpfile yang dibuat oleh
mysqldump
, yang membuat tabel secara alfabet, yang dalam kasus saya, menyebabkan kunci asing ke tabel referensi yang dibuat kemudian dalam file. (Alat peraga untuk halaman ini untuk menunjukkannya: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ )Karena mysqldump memesan tabel secara alfabet dan saya tidak ingin mengubah nama tabel, saya mengikuti instruksi dalam jawaban oleh JeremyWeir di halaman ini , yang menyatakan untuk meletakkan
set FOREIGN_KEY_CHECKS = 0;
di bagian atas file dump dan meletakkanSET FOREIGN_KEY_CHECKS = 1;
di bagian bawah file dump .Solusi itu berhasil untuk saya.
sumber
Jadi saya mencoba semua perbaikan di atas dan tidak berhasil. Saya mungkin melewatkan kesalahan di tabel saya -hanya tidak dapat menemukan penyebabnya dan saya terus mendapatkan kesalahan 1215. Jadi saya menggunakan perbaikan ini.
Di lingkungan lokal saya di phpMyAdmin, saya mengekspor data dari tabel yang dimaksud. Saya memilih format CSV. Saat masih di phpMyAdmin dengan tabel yang dipilih, saya memilih "More-> Options". Di sini saya menggulir ke bawah ke "Salin tabel ke (database.table). Pilih" Struktur saja ". Ubah nama tabel sesuatu, mungkin hanya menambahkan kata" salin "di sebelah nama tabel saat ini. Klik" Pergi "Ini akan membuat yang baru Ekspor tabel baru dan impor ke server baru atau yang lain. Saya juga menggunakan phpMyAdmin di sini. Setelah diimpor ubah nama tabel kembali ke nama aslinya. Pilih tabel baru, pilih impor. Untuk format pilih CSV Hapus centang "aktifkan pemeriksaan kunci asing". Pilih "Pergi". Sejauh ini semuanya berfungsi baik.
Saya memposting perbaikan saya di blog saya .
sumber
Bahkan saya punya masalah yang sama. Dan kesalahannya adalah dengan penanda "tidak ditandatangani" dalam tabel FK PK
sumber
Saya memiliki kesalahan yang sama sekali. Saya hanya cukup me-restart server MySQL dan memperbaiki masalahnya.
sumber