pengembangan-web-mp.com

Batasan kunci asing palsu gagal

Saya mendapatkan pesan kesalahan ini:

GALAT 1217 (23000) pada 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 adalah saya sudah menjatuhkan semua tabel lainnya dalam skema yang memiliki kunci asing terhadap area. Sebenarnya, database kosong kecuali untuk tabel area.

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 perintah RENAME TABLE area TO something_else: -?)

110

Dua kemungkinan:

  1. Ada tabel dalam skema lain ("database" dalam terminologi mysql) yang memiliki referensi FK
  2. Kamus data internal innodb tidak sinkron dengan kamus mysql.

Anda dapat melihat tabel mana itu (salah satunya) dengan melakukan "SHOW ENGINE INNODB STATUS" setelah drop gagal.

Jika ternyata menjadi kasus terakhir, saya akan membuang dan mengembalikan seluruh server jika Anda bisa.

MySQL 5.1 dan di atasnya akan memberi Anda nama tabel dengan FK dalam pesan kesalahan.

101
MarkR

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=828 ), sehingga diperlukan untuk menulis semua drop pernyataan dalam satu permintaan, mis.

SET FOREIGN_KEY_CHECKS=0; 
DROP TABLE my_first_table_to_drop; 
DROP TABLE my_second_table_to_drop; 
SET FOREIGN_KEY_CHECKS=1; 

Di mana SET FOREIGN_KEY_CHECKS=1 berfungsi sebagai langkah pengamanan tambahan ...

121
Karlis Rode

Nonaktifkan pemeriksaan kunci asing

SET FOREIGN_KEY_CHECKS=0
47
Flakron Bytyqi

dari blog ini :

Anda dapat menonaktifkan sementara pemeriksaan kunci asing:

SET FOREIGN_KEY_CHECKS=0;

Pastikan untuk mengembalikannya setelah Anda selesai bermain-main:

SET FOREIGN_KEY_CHECKS=1;
28
JackD

semoga berhasil

SET foreign_key_checks = 0; DROP TABLE table name; SET foreign_key_checks = 1;

6
M_ Fa

Di Rails, orang dapat melakukan hal berikut menggunakan Rails console:

connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
1
yeyo

saya menemukan solusi mudah, ekspor database, edit apa yang ingin Anda edit dalam editor teks, lalu impor. Selesai

0
Abdulrahman K

Mungkin Anda menerima kesalahan saat bekerja dengan tabel ini sebelumnya. Anda dapat mengubah nama tabel dan mencoba menghapusnya lagi.

ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;
0