لماذا يفشل TRUNCATE لجدول مرتبط بمفتاح أجنبي؟

متقدمقراءة دقيقةآخر تحديث 2 أكتوبر 2026

SQL قواعد البيانات

الإجابة

قد يفشل TRUNCATE TABLE لجدول InnoDB تشير إليه علاقة مفتاح أجنبي من جدول آخر، حتى لو كان الجدول التابع فارغًا. يرتبط هذا المنع بوجود القيد الذي يشير إلى الجدول، وليس فقط بوجود صفوف تابعة تحمل مراجع فعلية وقت تنفيذ الأمر.

لنفترض أن جدول الطلبات يشير إلى جدول العملاء. حذف جميع الطلبات لا يزيل تعريف العلاقة من قاعدة البيانات. لذلك لا تصبح محاولة تفريغ جدول العملاء باستخدام TRUNCATE مسموحة تلقائيًا. وينبغي التمييز بين إزالة بيانات الجدول التابع وإزالة القيد نفسه، فهما عمليتان مختلفتان تمامًا ولهما آثار مختلفة.

مثال

DELETE FROM orders;
DELETE FROM customers;

يمكن أن يكون الحذف بهذا الترتيب مناسبًا لتفريغ الجدولين مع إبقاء العلاقة، إذا لم توجد علاقات أخرى تمنع ذلك. لا ينصح باعتبار تعطيل فحص المفاتيح حلًا تلقائيًا، لأن الحفاظ على اتساق البيانات جزء من تصميم العملية.

باختصار: وجود مفتاح أجنبي من جدول آخر قد يمنع TRUNCATE للأصل ولو كان التابع فارغًا.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

بعد التجهيز التالي، لماذا ترفض محاولة TRUNCATE TABLE customers في الإعدادات الافتراضية؟

CREATE TABLE customers (
  id INT PRIMARY KEY
) ENGINE = InnoDB;
CREATE TABLE orders (
  id INT PRIMARY KEY,
  customer_id INT,
  CONSTRAINT fk_orders_customer
    FOREIGN KEY (customer_id) REFERENCES customers(id)
) ENGINE = InnoDB;
INSERT INTO customers VALUES (1);
-- orders is empty.