Saya mengalami sedikit masalah aneh. Saya mencoba menambahkan kunci asing ke satu tabel yang mereferensikan yang lain, tetapi gagal karena beberapa alasan. Dengan pengetahuan MySQL saya yang terbatas, satu-satunya hal yang mungkin dapat dicurigai adalah bahwa ada kunci asing pada tabel berbeda yang merujuk pada referensi yang saya coba referensi.
Saya sudah melakukan SHOW CREATE TABLE
query pada kedua tabel, sourcecodes_tags
adalah tabel dengan kunci asing, sourcecodes
adalah tabel yang direferensikan.
CREATE TABLE `sourcecodes` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned NOT NULL,
`language_id` int(11) unsigned NOT NULL,
`category_id` int(11) unsigned NOT NULL,
`title` varchar(40) CHARACTER SET utf8 NOT NULL,
`description` text CHARACTER SET utf8 NOT NULL,
`views` int(11) unsigned NOT NULL,
`downloads` int(11) unsigned NOT NULL,
`time_posted` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `language_id` (`language_id`),
KEY `category_id` (`category_id`),
CONSTRAINT `sourcecodes_ibfk_3` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `sourcecodes_ibfk_2` FOREIGN KEY (`category_id`) REFERENCES `categories` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
CREATE TABLE `sourcecodes_tags` (
`sourcecode_id` int(11) unsigned NOT NULL,
`tag_id` int(11) unsigned NOT NULL,
KEY `sourcecode_id` (`sourcecode_id`),
KEY `tag_id` (`tag_id`),
CONSTRAINT `sourcecodes_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Ini adalah kode yang menghasilkan kesalahan:
ALTER TABLE sourcecodes_tags ADD FOREIGN KEY (sourcecode_id) REFERENCES sourcecodes (id) ON DELETE CASCADE ON UPDATE CASCADE
Jawaban:
Kemungkinan besar
sourcecodes_tags
tabel Anda mengandungsourcecode_id
nilai yang tidak lagi ada disourcecodes
tabel Anda . Anda harus menyingkirkan itu dulu.Berikut ini kueri yang dapat menemukan ID itu:
sumber
UPDATE sourcecodes_tags SET sourcecode_id = NULL WHERE sourcecode_id NOT IN (SELECT id FROM sourcecodes)
harus membantu untuk menyingkirkan ID tersebut. Atau jikanull
tidak diizinkansourcecode_id
, maka hapus baris itu atau tambahkan nilai-nilai yang hilang kesourcecodes
tabel.SELECT Tchild.id FROM Tchild INNER JOIN Tmain ON Tmain.id = Tchild.fk_id WHERE Tmain.id IS NULL
tidak mengembalikan apa-apa, jadi masalahnya ada di tempat lain !?UPDATE `homestead`.`automations` SET `deleted_at`=NULL WHERE deleted_at IS NOT NULL;
, yang tidak melibatkan kunci asing sama sekali, jadi saya bingung. Tetapi kenyataan bahwa tabel kontak saya tidak memiliki beberapa catatan yang dirujuk oleh tabel otomasi menyebabkannya membuang "Kode Kesalahan: 1452. Tidak dapat menambah atau memperbarui baris anak: batasan kunci asing gagal".Saya memiliki masalah yang sama dengan database MySQL saya tetapi akhirnya, saya mendapat solusi yang berhasil untuk saya.
Karena di meja saya semuanya baik-baik saja dari sudut pandang mysql (kedua tabel harus menggunakan mesin InnoDB dan tipe data dari setiap kolom harus dari jenis yang sama yang mengambil bagian dalam batasan kunci asing).
Satu-satunya hal yang saya lakukan adalah menonaktifkan pemeriksaan kunci asing dan kemudian mengaktifkannya setelah melakukan operasi kunci asing.
Langkah-langkah yang saya ambil:
sumber
Gunakan
NOT IN
untuk menemukan di mana kendala membatasi :jadi, lebih khusus:
EDIT:
IN
danNOT IN
operator diketahui jauh lebih cepat daripadaJOIN
operator, juga lebih mudah untuk membangun, dan ulangi.sumber
Pangkas tabel dan kemudian coba tambahkan Kendala FK .
Saya tahu solusi ini agak canggung tetapi berhasil 100%. Tetapi saya setuju bahwa ini bukan solusi ideal untuk mengatasi masalah, tetapi saya harap ini membantu.
sumber
Bagi saya, masalah ini sedikit berbeda dan sangat mudah untuk diperiksa dan dipecahkan.
Anda harus memastikan KEDUA tabel Anda adalah InnoDB. Jika salah satu tabel, yaitu tabel referensi adalah MyISAM, batasannya akan gagal.
sumber
Ini juga terjadi ketika menetapkan kunci asing ke parent.id ke child.column jika child.column sudah memiliki nilai 0 dan tidak ada nilai parent.id adalah 0
Anda perlu memastikan bahwa setiap child.column adalah NULL atau memiliki nilai yang ada di parent.id
Dan sekarang saya membaca pernyataan no aja, itulah yang dia validasi.
sumber
Saya memiliki masalah yang sama hari ini. Saya menguji empat hal, beberapa di antaranya sudah disebutkan di sini:
Apakah ada nilai di kolom anak Anda yang tidak ada di kolom induk (selain NULL, jika kolom anak nullable)
Apakah kolom anak dan orang tua memiliki tipe data yang sama?
Apakah ada indeks pada kolom induk yang Anda referensikan? MySQL sepertinya memerlukan ini untuk alasan kinerja ( http://dev.mysql.com/doc/refman/5.5/en/create-table-foreign-keys.html )
Dan yang ini menyelesaikannya untuk saya: Apakah kedua tabel memiliki susunan yang identik?
Saya punya satu meja di UTF-8 dan yang lainnya di iso-sesuatu. Itu tidak berhasil. Setelah mengubah iso-table menjadi UTF-8 collation, kendala dapat ditambahkan tanpa masalah. Dalam kasus saya, phpMyAdmin bahkan tidak menampilkan tabel anak dalam iso-encoding di dropdown untuk membuat batasan kunci asing.
sumber
Tampaknya ada beberapa nilai tidak valid untuk baris kolom 0 yang bukan kunci asing yang valid sehingga MySQL tidak dapat menetapkan batasan kunci asing untuknya.
Anda dapat mengikuti langkah-langkah ini:
Jatuhkan kolom yang telah Anda coba atur batasan FK.
Tambahkan lagi dan tetapkan nilai defaultnya sebagai NULL.
Coba atur batasan kunci asing lagi.
sumber
Saya akan masalah yang sama, saya memeriksa baris tabel saya dan menemukan ada beberapa ketidakcocokan dengan nilai bidang yang saya ingin mendefinisikan kunci asing. Saya mengoreksi nilai itu, mencoba lagi dan masalahnya selesai.
sumber
Saya akhirnya menghapus semua data di tabel saya, dan menjalankan alter lagi. Berhasil. Bukan yang brilian, tetapi menghemat banyak waktu, terutama aplikasi Anda masih dalam tahap pengembangan tanpa data pelanggan.
sumber
coba ini
sumber
Saya memiliki masalah yang sama persis ini sekitar tiga kali berbeda. Dalam setiap contoh itu karena satu (atau lebih) catatan saya tidak sesuai dengan kunci asing baru. Anda mungkin ingin memperbarui catatan Anda yang ada untuk mengikuti batasan sintaks kunci asing sebelum mencoba menambahkan kunci itu sendiri. Contoh berikut umumnya mengisolasi catatan masalah:
ulangi
AND (candidate key) <> (next proposed foreign key value)
dalam kueri Anda untuk setiap nilai dalam kunci asing.Jika Anda memiliki banyak catatan, ini bisa sulit, tetapi jika meja Anda cukup kecil, seharusnya tidak terlalu lama. Saya tidak super luar biasa dalam sintaks SQL, tetapi ini selalu mengisolasi masalah bagi saya.
sumber
Kosongkan data tabel Anda dan jalankan perintah. Itu akan berhasil.
sumber
Saya mendapatkan kesalahan ini saat menggunakan Laravel dan fasih, mencoba membuat tautan kunci asing akan menyebabkan 1452. Masalahnya adalah kurangnya data di tabel yang ditautkan.
Silakan lihat di sini untuk contoh: http://mstd.eu/index.php/2016/12/02/laravel-eloquent-integrity-constraint-violation-1452-foreign-key-constraint/
sumber
Saya sedang menyiapkan solusi ini dan contoh ini dapat membantu.
Basis data saya memiliki dua tabel (email dan kartu kredit) dengan kunci utama untuk ID mereka. Tabel lain (klien) merujuk ke tabel ID ini sebagai kunci asing. Saya punya alasan untuk memisahkan email dari data klien.
Pertama saya memasukkan data baris untuk tabel yang direferensikan (email, credit_card) kemudian Anda mendapatkan ID untuk masing-masing, ID tersebut diperlukan di tabel ketiga (klien).
Jika Anda tidak memasukkan terlebih dahulu baris dalam tabel yang direferensikan, MySQL tidak akan dapat membuat korespondensi ketika Anda memasukkan baris baru di tabel ketiga yang merujuk kunci asing.
Jika Anda pertama kali memasukkan baris yang direferensikan untuk tabel yang direferensikan, maka baris yang merujuk ke kunci asing, tidak ada kesalahan terjadi.
Semoga ini membantu.
sumber
Pastikan nilainya ada di tabel lain jika tidak Anda akan mendapatkan kesalahan ini, di kolom yang sesuai ditugaskan.
Jadi jika kolom yang ditugaskan ditugaskan untuk id baris dari tabel lain, pastikan ada baris yang ada di tabel jika tidak kesalahan ini akan muncul.
sumber
Anda dapat mencoba contoh ini
Catatan: jika Anda menggunakan phpmyadmin cukup hapus centang Aktifkan pemeriksaan kunci asing
sebagai contoh
semoga soloution ini memperbaiki masalah Anda :)
sumber
Anda hanya perlu menjawab satu pertanyaan:
Apakah meja Anda sudah menyimpan data? (Terutama meja termasuk kunci asing.)
Jika jawabannya adalah ya, maka satu-satunya hal yang perlu Anda lakukan adalah menghapus semua catatan, maka Anda bebas menambahkan kunci asing apa pun ke tabel Anda.
Alasan Anda tidak dapat menambahkan kunci asing setelah entri data karena inkonsistensi tabel, bagaimana Anda akan berurusan dengan kunci asing baru pada data yang sebelumnya diisi tabel?
Jika jawabannya tidak, maka ikuti instruksi lainnya.
sumber
harus membantu untuk menyingkirkan ID tersebut. Atau jika
null
tidak diizinkansourcecode_id
, maka hapus baris itu atau tambahkan nilai-nilai yang hilang kesourcecodes
tabel.sumber
Saya memiliki masalah yang sama dan menemukan solusi,
NULL
bukan menempatkanNOT NULL
pada kolom kunci asing. Berikut ini kueri:MySQL telah menjalankan kueri ini!
sumber
Dalam kasus saya, saya membuat tabel baru dengan struktur yang sama, membuat hubungan dengan tabel lain, lalu mengekstraksi data dalam CSV dari tabel lama yang memiliki masalah, kemudian mengimpor CSV ke tabel baru dan menonaktifkan pemeriksaan kunci asing dan menonaktifkan interupsi impor, semua data saya dimasukkan ke tabel baru yang tidak memiliki masalah berhasil, kemudian menghapus tabel lama.
Ini berhasil untuk saya.
sumber