MySQL Error 1215: Tidak dapat menambahkan batasan kunci asing

336

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
Robert B
sumber
6
Silakan kirim skema untuk tabel induk: Clientsdan Staff.
Ike Walker
kemungkinan duplikat kesalahan MySQL tidak dapat menambahkan batasan kunci asing
Denis de Bernardy
1
@Denis itu mungkin bukan duplikat karena OP mengatakan mereka telah memverifikasi bahwa kolom adalah PK di tabel induk.
Ike Walker
Saya telah menambahkan pernyataan SQL untuk tabel Klien dan Staf seperti yang diminta.
Robert B
Kemungkinan duplikat MySQL Tidak Dapat Menambahkan Batasan Kunci Asing
Prometheus

Jawaban:

594

Saya menduga itu Clients.Case_Numberdan / atau Staff.Emp_IDbukan tipe data yang sama persis dengan Clients_has_Staff.Clients_Case_Numberdan Clients_has_Staff.Staff_Emp_ID.

Mungkin kolom dalam tabel induk adalah INT UNSIGNED?

Mereka harus persis tipe data yang sama di kedua tabel.

Ike Walker
sumber
10
Terima kasih. Ini ternyata menjadi masalah. Staff.Emp_ID adalah SMALLINT, sedangkan kolom referensi adalah INT. Terkadang itu adalah hal-hal kecil ...
Robert B
Tks. Dalam kasus saya, saya tidak sengaja mengklik "ZeroFill" pada kunci asing di tabel anak yang berarti tidak cocok persis dengan kolom tabel induk.
wwkudu
12
Bisa juga bahwa rangkaian karakter berbeda. Saya menangani masalah ini di mana satu kolom memiliki set karakter utf8 sementara yang lain memiliki latin1. Mudah diperbaiki dengan ALTER TABLE TableCHARACTER SET = utf8; dan ALTER TABLE DeviceCHANGE COLUMN ID IDCHAR (36) CHARACTER SET 'utf8' NOT NULL;
www.jensolsson.se
3
@ www.jensolsson.se Anda benar, jika PK menyertakan satu atau lebih kolom string maka mereka harus menggunakan set karakter dan susunan yang sama . Dalam kasus khusus ini PK adalah INT sehingga set karakter tabel dan / atau kolom tidak relevan.
Ike Walker
2
Kolasi adalah masalah saya, latin1 vs utf8 (periksa tabel DAN kolom).
ben_979
244

Alasan Anda mungkin mendapatkan kesalahan batasan kunci asing:

  1. Anda tidak menggunakan InnoDB sebagai mesin di semua tabel.
  2. Anda mencoba merujuk kunci yang tidak ada pada tabel target. Pastikan itu adalah kunci di tabel lain (itu bisa menjadi kunci primer atau unik)
  3. Jenis kolom tidak sama (pengecualian adalah kolom pada tabel referensi dapat dibatalkan).
  4. Jika PK / FK adalah varchar, pastikan pemeriksaannya sama untuk keduanya.

Memperbarui:

  1. Salah satu alasannya mungkin juga karena kolom yang Anda gunakan ON DELETE SET NULLtidak didefinisikan sebagai nol. Jadi, pastikan kolomnya disetel nol default.

Lihat ini.

Pil Ledakan
sumber
14
Saya hanya akan menambahkan bahwa jika FK ada di kolom karakter, saya pikir mereka harus dari charset dan collation yang sama. (Atau mungkin rangkaian byte 1 byte dan 2 byte tidak kompatibel.)
Graham Charles
5
Alasan saya adalah yang pertama Anda tunjukkan "Mesin DB yang berbeda untuk dua tabel, InnoDB dan MyISAM"
Randika Vishman
7
Saya mendapatkan satu alasan lain =) `` `ON DELETE CASCADE ON UPDATE SET NULL:` `` Anda telah menetapkan kondisi SET NULL meskipun beberapa kolom didefinisikan sebagai NOT NULL. Jadi, saya hanya memperbaiki definisi FK.
alexglue
1
Kemungkinan kegagalan juga adalah tidak adanya indeks pada bidang target.
Paul T. Rawkeen
1
bagus, poin ke-4 adalah masalah saya. Agak tidak menyenangkan - tapi saya sangat senang mysql melakukan crash untuk itu
Sebas
85

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

SHOW ENGINE INNODB STATUS;

Anda mungkin menemukan kesalahan di dekat bagian atas pesan yang dicetak seperti

Tidak dapat menemukan indeks dalam tabel referensi di mana kolom yang direferensikan muncul sebagai kolom pertama, atau jenis kolom dalam tabel dan tabel yang direferensikan tidak cocok dengan kendala.

arvind
sumber
13
Ini adalah jawaban terbaik yang menurut saya membantu dalam diagnostik! Terima kasih.
alexglue
Bagaimana cara kerjanya? Jalankan kedua kueri berturut-turut?
C4d
@ C4u, ya kita harus menjalankan kedua pertanyaan berturut-turut dengan memiliki SHOW ENGINE INNODB STATUS sebagai yang pertama dan kemudian diikuti oleh pertanyaan lain
sureshd
Melakukannya di PHPMyAdmin tidak akan berfungsi. lakukan pada prompt perintah.
ruwan800
13

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 UPDATEdan ON DELETE. Misalnya:

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

tidak akan terbang, karena KUNCI UTAMA (seperti id) tidak bisa NULL.

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!

Domi
sumber
1
Anda juga akan mendapatkan kesalahan ini jika Anda mencoba untuk menghapus kunci asing yang tidak ada di sana :)
Explosion Pills
2
Juga, dari dokumen: MySQL memerlukan indeks pada kunci asing dan kunci referensi sehingga pemeriksaan kunci asing dapat cepat dan tidak memerlukan pemindaian tabel. Dalam tabel referensi, harus ada indeks di mana kolom kunci asing terdaftar sebagai kolom pertama dalam urutan yang sama . Indeks semacam itu dibuat pada tabel referensi secara otomatis jika tidak ada. Indeks ini mungkin turun secara diam-diam nanti, jika Anda membuat indeks lain yang dapat digunakan untuk menegakkan batasan kunci asing. index_name, jika diberikan, digunakan seperti yang dijelaskan sebelumnya.
Jonathan M
1
Itulah alasan saya datang ke sini: Saya mencoba membuat kunci asing ON DELETE SET NULLpada kolom yang saya inginkan NOT NULL. Misalkan Anda tidak dapat memiliki kue dan memakannya juga.
Martin Hennings
8

Periksa susunan tabel, menggunakan SHOW TABLE STATUSAnda dapat memeriksa informasi tentang tabel, termasuk susunan tersebut.

Kedua tabel harus memiliki susunan yang sama.

Itu terjadi pada saya.

Carlos Laspina
sumber
Ini adalah masalah dalam kasus saya - kesalahan MySQL sama sekali tidak membantu!
Menilai
7

Dalam kasus saya, saya telah menghapus tabel menggunakan SET FOREIGN_KEY_CHECKS=0, lalu SET FOREIGN_KEY_CHECKS=1sesudahnya. Ketika saya pergi untuk memuat ulang tabel, saya dapat error 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 memicu error 1215. Saya menyelesaikan masalah dengan menjatuhkan dan kemudian memuat kembali tabel lainnya dengan tipe data baru untuk bidang yang terlibat.

CodeMed
sumber
5

Saya mendapat kesalahan yang sama ketika mencoba menambahkan fk. Dalam kasus saya, masalahnya disebabkan oleh PK tabel FK yang ditandai sebagai tidak ditandatangani.

Alex
sumber
5

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.

pengguna2975399
sumber
3

saya punya masalah yang sama, solusi saya:

Sebelum:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Larutan:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

Saya harap ini membantu;)

Yacine Richthofen
sumber
1
Anda lupa beberapa koma di BUAT pertama Anda
DLight
3

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

pengguna3478348
sumber
3

Saya hanya ingin menambahkan kasus ini juga untuk VARCHARhubungan 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 VARCHARdan 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 penggunaan

SHOW ENGINE INNODB STATUS;

Saat menggunakan perintah ini saya mendapatkan deskripsi verbose berikut untuk kesalahan tanpa informasi bermanfaat tambahan

Tidak dapat menemukan indeks dalam tabel referensi di mana kolom yang direferensikan muncul sebagai kolom pertama, atau jenis kolom dalam tabel dan tabel yang direferensikan tidak cocok dengan kendala. Perhatikan bahwa tipe penyimpanan internal ENUM dan SET berubah dalam tabel yang dibuat dengan> = InnoDB-4.1.12, dan kolom seperti itu di tabel lama tidak dapat dirujuk oleh kolom tersebut di tabel baru. Silakan merujuk ke http://dev.mysql.com/doc/refman/8.0/id/innodb-foreign-key-constraints.html untuk definisi kunci asing yang benar.

Setelah itu saya gunakan SET FOREIGN_KEY_CHECKS=0;seperti yang disarankan oleh Arvind Bharadwaj dan tautannya di sini :

Ini memberi pesan kesalahan berikut:

Kode Kesalahan: 1822. Gagal menambahkan batasan kunci asing. Indeks tidak ada untuk kendala

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:

Kesalahan 1452: Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal

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 utf8mb4set karakter dan utf8mb4_0900_ai_cipemeriksaan, namun, kolom lain dalam tabel induk dirujuk menggunakan CHARACTER 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:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Ini akhirnya menyelesaikan masalah saya dengan kesalahan 1215.

Catatan Sisi: Susunan utf8mb4_general_ciberfungsi di MySQL Workbench 5.0 atau lebih baru. Collation utf8mb4_0900_ai_cihanya 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.

CoderBapu
sumber
2

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
)
gathila
sumber
2

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.

Mozaffar
sumber
2

Untuk MySQL (INNODB) ... dapatkan definisi untuk kolom yang ingin Anda tautkan

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

bandingkan dan verifikasi kedua definisi kolom miliki

COLUMN_TYPE (panjang) yang sama, COLATION yang sama

bisa membantu 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;
bortunac
sumber
2

Periksa kompatibilitas tabel. Misalnya, jika satu tabel MyISAMdan yang lain adalah InnoDB, Anda mungkin memiliki masalah ini.

Dennis
sumber
2

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

robsch
sumber
1

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.

nmgeek
sumber
1

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.

Chris Neve
sumber
1

Bagi saya itu adalah jenis kolom. BigINT! = INT.

Tapi itu tetap tidak berhasil.

Jadi saya memeriksa mesinnya. Pastikan Table1 = InnoDB dan Table = InnoDB

Chad
sumber
1

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

Stephen Nortje
sumber
Bagaimana apanya?
Yazan Jaber
2
@YazanJaber Saya pikir maksudnya begini : InnoDB mengizinkan kunci asing untuk mereferensikan setiap kolom indeks atau grup kolom. Namun, dalam tabel yang direferensikan, harus ada indeks di mana kolom yang direferensikan terdaftar sebagai kolom pertama dalam urutan yang sama.
robsch
1

ketika mencoba membuat kunci asing saat menggunakan migrasi laravel

seperti contoh ini:

tabel pengguna

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

tabel warna

    public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

terkadang properti tidak berfungsi

[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint

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 Integersebagai kunci asing

    $table-> unsignedInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Saat Anda menggunakan kunci utama $table->tinyIncrements('id');

Anda harus menggunakan unsignedTinyIntegersebagai kunci asing

    $table-> unsignedTinyInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Saat Anda menggunakan kunci utama $table->smallIncrements('id');

kamu harus menggunakan unsignedSmallIntegersebagai kunci asing

    $table-> unsignedSmallInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');

Saat Anda menggunakan kunci utama $table->mediumIncrements('id');

Anda harus menggunakan unsignedMediumIntegersebagai kunci asing

    $table-> unsignedMediumInteger('fk_id');
    $table->foreign('fk_id')->references('id')->on('table_name');
MAHDI ABDULSAHIB
sumber
Ini membantu saya. Saya memiliki bigIncrementssebagai kunci utama, jadi saya harus menggunakanunsignedBigInteger
jagad89
1

Dalam kasus saya, saya harus menonaktifkan FOREIGN KEYpemeriksaan karena tabel sumber tidak ada.

SET FOREIGN_KEY_CHECKS=0;

Arvind Bhardwaj
sumber
0

Waspadai penggunaan backquotes juga. Saya memiliki dalam naskah pernyataan berikut ini

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

tetapi backquotes pada akhirnya salah. Seharusnya:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL tidak memberikan rincian tentang kesalahan ini ...

Olivier Faucheux
sumber
0

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.

Dima Dz
sumber
0

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.

noowie
sumber
0

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.

sedikit
sumber
0

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.

Arya
sumber
0

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 .

DukesNuz
sumber
-1

Bahkan saya punya masalah yang sama. Dan kesalahannya adalah dengan penanda "tidak ditandatangani" dalam tabel FK PK

blueFroggy
sumber
-6

Saya memiliki kesalahan yang sama sekali. Saya hanya cukup me-restart server MySQL dan memperbaiki masalahnya.

b5bus
sumber
Ini sama sekali tidak memperbaiki masalah.
James111