Saya mendapatkan pesan kesalahan ini:
ERROR 1217 (23000) di baris 40: Tidak dapat menghapus atau memperbarui baris induk: batasan kunci asing gagal
... ketika saya mencoba menjatuhkan tabel:
DROP TABLE IF EXISTS `area`;
... didefinisikan seperti ini:
CREATE TABLE `area` (
`area_id` char(3) COLLATE utf8_spanish_ci NOT NULL,
`nombre_area` varchar(30) COLLATE utf8_spanish_ci NOT NULL,
`descripcion_area` varchar(100) COLLATE utf8_spanish_ci NOT NULL,
PRIMARY KEY (`area_id`),
UNIQUE KEY `nombre_area_UNIQUE` (`nombre_area`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;
Lucunya, saya sudah menjatuhkan semua tabel lain dalam skema yang memiliki kunci asing area
. Sebenarnya database kosong kecuali area
tabel.
Bagaimana mungkin memiliki baris anak jika tidak ada objek lain dalam database? Sejauh yang saya tahu, InnoDB tidak mengizinkan kunci asing di skema lain, bukan?
(Saya bahkan dapat menjalankan RENAME TABLE area TO something_else
perintah: -?)
CONSTRAINT fk_servicio_area1 FOREIGN KEY (area_id) REFERENCES area (area_id)
, tidak ada nama skema pada referensi tabel: -?Jawaban:
Dua kemungkinan:
Anda dapat melihat tabel mana itu (salah satunya, bagaimanapun) dengan melakukan "SHOW ENGINE INNODB STATUS" setelah penurunan gagal.
Jika ternyata kasus terakhir, saya akan membuang dan memulihkan seluruh server jika Anda bisa.
MySQL 5.1 dan di atasnya akan memberi Anda nama tabel dengan FK di pesan kesalahan.
sumber
SHOW ENGINE INNODB STATUS
laporan apa .Sesuai permintaan, sekarang sebagai jawaban ...
Saat menggunakan MySQL Query Browser atau phpMyAdmin, tampaknya koneksi baru dibuka untuk setiap kueri ( bugs.mysql.com/bug.php?id=8280 ), sehingga perlu untuk menulis semua pernyataan drop dalam satu kueri, misalnya.
Dimana
SET FOREIGN_KEY_CHECKS=1
berfungsi sebagai tindakan pengamanan ekstra ...sumber
SET FOREIGN_KEY_CHECKS=0;
ke awal dump.Nonaktifkan pemeriksaan kunci asing
sumber
SET FOREIGN_KEY_CHECKS=0
dan itu memperbaiki pesan kesalahan. Apakah Anda tahu mengapa ini diperlukan? Apakah kunci asing disimpan dalam cache bahkan setelah tabel hilang?SET FOREIGN_KEY_CHECKS=1;
setelah Anda selesai!SET FOREIGN_KEY_CHECKS=0; DROP TABLE my_first_table_to_drop; DROP TABLE my_second_table_to_drop; SET FOREIGN_KEY_CHECKS=1;
Dimana SET FOREIGN_KEY_CHECKS = 1 berfungsi sebagai tindakan keamanan ekstra ...dari blog ini :
Anda dapat menonaktifkan pemeriksaan kunci asing untuk sementara:
Pastikan untuk memulihkannya setelah Anda selesai mengotak-atik:
sumber
semoga berhasil
ATUR cek_kunci_ asing = 0; DROP TABLE
table name
; ATUR cek_kunci_ asing = 1;sumber
Di Rails, seseorang dapat melakukan hal berikut dengan menggunakan
rails console
:sumber
Mungkin Anda pernah menerima kesalahan saat bekerja dengan tabel ini sebelumnya. Anda dapat mengganti nama tabel dan mencoba menghapusnya lagi.
sumber
saya menemukan solusi yang mudah, ekspor database, edit apa yang ingin Anda edit di editor teks, lalu impor. Selesai
sumber
CREATE TABLE
kode dan memuat dump lagi ... tidak akan membuat MySQL menghapus tabel. Dan jika Anda bermaksud memulihkan dump dalam database baru ... Jika Anda ingin menghapus semua tabel seperti saya, database yang baru dibuat akan kosong. Jika Anda ingin menyimpan beberapa tabel,SET FOREIGN_KEY_CHECKS=0
solusi yang disebutkan di mana-mana di sini berfungsi dengan baik dan lebih sederhana; dan Anda mungkin tidak perlu mengedit dump karena salinan baru data Anda mungkin tidak memiliki kamus data yang tidak sinkron.Tidak dapat menghapus atau memperbarui baris induk: batasan kunci asing gagal (
table1
.user_role
, CONSTRAINTFK143BF46A8dsfsfds@#5A6BD60
FOREIGN KEY (user_id
) REFERENCESuser
(id
))Apa yang saya lakukan dalam dua langkah sederhana. pertama saya menghapus baris anak di tabel anak seperti
mysql> hapus dari tabel2 di mana role_id = 2 && user_id = 20;
Kueri OK, 1 baris terpengaruh (0,10 dtk)
dan langkah kedua sebagai menghapus induk
hapus dari table1 dimana id = 20;
Kueri OK, 1 baris terpengaruh (0,12 dtk)
Dengan ini saya memecahkan Masalah yang berarti Hapus Anak lalu Hapus orang tua
Saya harap Anda mendapatkannya. :)
sumber