it-swarm.asia

فشل القيد مفتاح خارجي

أحصل على رسالة الخطأ هذه:

خطأ 1217 (23000) في السطر 40: لا يمكن حذف أو تحديث صف أصل: فشل قيد مفتاح خارجي

... عندما أحاول إسقاط جدول:

DROP TABLE IF EXISTS `area`;

... يعرف مثل هذا:

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;

الشيء المضحك هو لقد أسقطت بالفعل جميع الجداول الأخرى في المخطط الذي يحتوي على مفاتيح خارجية ضد area. في الواقع ، قاعدة البيانات فارغة باستثناء الجدول area.

كيف يمكن أن تحتوي على صفوف فرعية إذا لم يكن هناك أي كائن آخر في قاعدة البيانات؟ على حد علمي ، لا يسمح InnoDB بالمفاتيح الخارجية على المخططات الأخرى ، أليس كذلك؟

(يمكنني حتى تشغيل أمر RENAME TABLE area TO something_else: -؟)

110
Álvaro González

احتمالان:

  1. يوجد جدول داخل مخطط آخر ("قاعدة بيانات" في مصطلحات mysql) يحتوي على مرجع FK
  2. قاموس بيانات innodb الداخلي غير متزامن مع mysql.

يمكنك أن ترى أي جدول كان (أحدها ، على أي حال) عن طريق القيام "بعرض حالة المحرك INNODB" بعد فشل السقوط.

إذا اتضح أن الحالة الأخيرة ، فسأغادر الخادم بالكامل ويستعيده إذا استطعت.

سيعطيك MySQL 5.1 وما فوق اسم الجدول مع FK في رسالة الخطأ.

101
MarkR

بناء على الطلب ، الآن كإجابة ...

عند استخدام MySQL Query Browser أو phpMyAdmin ، يبدو أنه يتم فتح اتصال جديد لكل استعلام ( bugs.mysql.com/bug.php؟id=8280 ) ، مما يجعل من الضروري كتابة جميع عبارات الإفلات في واحدة الاستعلام ، على سبيل المثال.

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

حيث يخدم SET FOREIGN_KEY_CHECKS=1 كإجراء أمني إضافي ...

121
Karlis Rode

تعطيل فحص المفتاح الخارجي

SET FOREIGN_KEY_CHECKS=0
47
Flakron Bytyqi

من هذه المدونة :

يمكنك تعطيل شيكات المفتاح الخارجي مؤقتًا:

SET FOREIGN_KEY_CHECKS=0;

فقط تأكد من استعادتها بمجرد انتهائك من العبث:

SET FOREIGN_KEY_CHECKS=1;
28
JackD

نأمل عملها

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

6
M_ Fa

على Rails ، يمكن للمرء القيام بما يلي باستخدام Rails console:

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

لقد وجدت حلاً سهلاً ، وقم بتصدير قاعدة البيانات ، وحررها ما تريد تحريره في محرر نصوص ، ثم قم باستيراده. فعله

0
Abdulrahman K

ربما تلقيت خطأ عند العمل مع هذا الجدول من قبل. يمكنك إعادة تسمية الجدول ومحاولة إزالته مرة أخرى.

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