أحصل على رسالة الخطأ هذه:
خطأ 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
: -؟)
احتمالان:
يمكنك أن ترى أي جدول كان (أحدها ، على أي حال) عن طريق القيام "بعرض حالة المحرك INNODB" بعد فشل السقوط.
إذا اتضح أن الحالة الأخيرة ، فسأغادر الخادم بالكامل ويستعيده إذا استطعت.
سيعطيك MySQL 5.1 وما فوق اسم الجدول مع FK في رسالة الخطأ.
بناء على الطلب ، الآن كإجابة ...
عند استخدام 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
كإجراء أمني إضافي ...
تعطيل فحص المفتاح الخارجي
SET FOREIGN_KEY_CHECKS=0
من هذه المدونة :
يمكنك تعطيل شيكات المفتاح الخارجي مؤقتًا:
SET FOREIGN_KEY_CHECKS=0;
فقط تأكد من استعادتها بمجرد انتهائك من العبث:
SET FOREIGN_KEY_CHECKS=1;
نأمل عملها
SET foreign_key_checks = 0؛ DROP TABLE table name
؛ SET foreign_key_checks = 1؛
على Rails ، يمكن للمرء القيام بما يلي باستخدام Rails console
:
connection = ActiveRecord::Base.connection
connection.execute("SET FOREIGN_KEY_CHECKS=0;")
لقد وجدت حلاً سهلاً ، وقم بتصدير قاعدة البيانات ، وحررها ما تريد تحريره في محرر نصوص ، ثم قم باستيراده. فعله
ربما تلقيت خطأ عند العمل مع هذا الجدول من قبل. يمكنك إعادة تسمية الجدول ومحاولة إزالته مرة أخرى.
ALTER TABLE `area` RENAME TO `area2`;
DROP TABLE IF EXISTS `area2`;