mysql - كيفية اقتطاع جدول خارجي مقيدة؟




foreign-keys constraints (6)

لماذا لا يعمل TRUNCATE على mygroup ؟ على الرغم من أن لدي ON DELETE CASCADE SET أحصل على:

خطأ 1701 (42000): لا يمكن اقتطاع جدول المشار إليه في قيد مفتاح خارجي ( mytest . instance CONSTRAINT instance_ibfk_1 FOREIGN KEY ( GroupID ) مراجع mytest . mygroup ( ID ))

drop database mytest;
create database mytest;
use mytest;

CREATE TABLE mygroup (
   ID    INT NOT NULL AUTO_INCREMENT PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE instance (
   ID           INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   GroupID      INT NOT NULL,
   DateTime     DATETIME DEFAULT NULL,

   FOREIGN KEY  (GroupID) REFERENCES mygroup(ID) ON DELETE CASCADE,
   UNIQUE(GroupID)
) ENGINE=InnoDB;

الإجابة هي بالفعل الإجابة التي يقدمها zerkms ، كما هو مذكور في الخيار 1 :

الخيار 1 : لا يخاطر بتعطل سلامة البيانات:

  1. إزالة القيود
  2. أداء اقتحام
  3. حذف الصفوف التي لديها الآن إشارات إلى أي مكان يدوياً
  4. خلق قيود

الجزء الصعب هو إزالة القيود ، لذلك أريد أن أخبرك كيف ، في حال احتاج شخص ما إلى معرفة كيفية القيام بذلك:

  1. تشغيل SHOW CREATE TABLE <Table Name> الاستعلام لمعرفة ما هو اسمك FOREIGN KEY (الإطار الأحمر في الصورة أدناه):

  2. تشغيل ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign Key Name> . سيؤدي هذا إلى إزالة قيد المفتاح الخارجي.

  3. قم بإسقاط الفهرس المرتبط (من خلال صفحة بنية الجدول) ، وقد انتهيت.

لإعادة إنشاء مفاتيح خارجية:

ALTER TABLE <Table Name>
ADD FOREIGN KEY (<Field Name>) REFERENCES <Foreign Table Name>(<Field Name>);

الحصول على حالة التحقق من المفتاح الخارجي القديم ووضع sql هي أفضل طريقة لاقتطاع / إسقاط الجدول كما يفعل Mysql Workbench أثناء مزامنة طراز إلى قاعدة البيانات.

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;`
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

DROP TABLE TABLE_NAME;
TRUNCATE TABLE_NAME;

SET [email protected]_SQL_MODE;
SET [email protected]_FOREIGN_KEY_CHECKS;
SET [email protected]_UNIQUE_CHECKS;

في حين تم طرح هذا السؤال منذ أكثر من 5 سنوات ولا أعرف أن هذا المرفق موجود في MySql في ذلك الوقت ولكن الآن إذا كنت تستخدم phpmyadmin يمكنك ببساطة فتح قاعدة البيانات ثم تحديد الجدول (الجداول) الذي تريد اقتطاعه. في الجزء السفلي هناك قائمة منسدلة مع العديد من الخيارات المدرجة. فتحه وحدد خيار فارغ تحت العنوان حذف البيانات أو الجدول . ينقلك إلى الصفحة التالية تلقائيًا حيث يوجد خيار في خانة الاختيار يسمى تدقيق المفتاح الخارجي. فقط قم بإلغاء تحديدها ثم اضغط على الزر "نعم" وسيتم اقتطاع الجدول (الجداول) المحددة. قد يكون داخليًا يتم تشغيل الاستعلام المقترح في إجابة user447951. ولكنها مريحة جدا للاستخدام من واجهة phpmyadmin.


كما في وثائق mysql ، لا يمكن استخدام TRUNCATE على جداول بعلاقات المفتاح الخارجي. لا يوجد بديل كامل AFAIK.

إسقاط contraint مازال لا يستدعي ON DELETE و ON UPDATE. الحل الوحيد الذي يمكنني أن أفكره في أجهزة الصراف الآلي هو:

  • حذف جميع الصفوف ، إسقاط المفاتيح الخارجية ، اقتطاع ، إعادة إنشاء المفاتيح
  • حذف جميع الصفوف ، وإعادة ضبط auto_increment (إذا تم استخدامها)

يبدو أن اقتطاع في MySQL ليس ميزة كاملة حتى الآن (كما أنه لا يستدعي المشغلات). انظر التعليق


نعم يمكنك:

SET FOREIGN_KEY_CHECKS = 0;

TRUNCATE table1;
TRUNCATE table2;

SET FOREIGN_KEY_CHECKS = 1;

مع هذه العبارات ، فأنت تخاطر بالدخول إلى صفوف في جداولك التي لا تلتزم بقيود FOREIGN KEY .


يمكنك ان تفعل

DELETE FROM `mytable` WHERE `id` > 0




dml