انتقل إلى محتوى الدرس
الدرس 20
دورة MySQL

قيد المفتاح الأجنبي FOREIGN KEY والتكامل المرجعيMySQL FOREIGN KEY Constraint and Referential Actions

تعلّم قيد المفتاح الأجنبي FOREIGN KEY والتكامل المرجعي بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
أقسام الدرس
6
الأمثلة
4
اللغة
العربية
تاريخ النشر
غير محدد
المشاهدات
8
محتوى الدرس
في هذا الدرس 6تصفّح المواضيع

عند تفعيل قيد FOREIGN KEY، يحرس محرك InnoDB العلاقة في الاتجاهين مع كل عملية كتابة أو تعديل:

  • حراسة الجدول الابن (خطأ 1452): يمنع إضافة سجل ابن يشير إلى رقم أب غير موجود في الجدول الأب.
  • حراسة الجدول الأب (خطأ 1451): يمنع حذف سجل الأب أو تغيير معرّفه بطريقة تترك سجلات أبناء يتيمة (Orphan Rows)، وذلك وفق الإجراء المحدد في جملتي ON DELETE وON UPDATE.

يمكنك توجيه محرك InnoDB لتنفيذ إجراء تلقائي على سجلات الابن عند حذف السجل الأب أو تحديث مفتاحه:

  • الحذف المتسلسل ON DELETE CASCADE: يحذف تلقائياً جميع سجلات الابن المرتبطة فور حذف السجل الأب (مناسب للبيانات التابعة كلياً مثل بنود الفاتورة أو جلسات الدخول).
  • تفريغ المرجع ON DELETE SET NULL: يحوّل قيمة المفتاح الأجنبي في الابن إلى NULL عند حذف الأب مع الإبقاء على سجل الابن محفوظاً. تنبيه: يشترط هذا الخيار أن يكون عمود الابن قابلاً للفراغ (NULL وليس NOT NULL).
SQL
CREATE TABLE blog_posts (
    post_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    author_id BIGINT UNSIGNED NULL,
    title VARCHAR(150) NOT NULL,
    PRIMARY KEY (post_id),
    CONSTRAINT fk_posts_author
        FOREIGN KEY (author_id) REFERENCES customers (id)
        ON DELETE SET NULL
        ON UPDATE CASCADE
);

عند عدم تحديد جملة ON DELETE أو ON UPDATE، يطبق MySQL افتراضياً خيار المنع الصارم RESTRICT (وهو مطابق تماماً لخيار NO ACTION في محرك InnoDB). يمنع هذا الخيار حذف أي سجل أب لا تزال له سجلات أبناء مرتبطة (Error 1451)، مما يحمي السجلات المالية والفواتير التاريخية من الحذف المتسلسل غير المقصود:

SQL
CREATE TABLE payment_receipts (
    receipt_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
    order_id BIGINT UNSIGNED NOT NULL,
    amount_paid DECIMAL(10, 2) NOT NULL CHECK (amount_paid > 0),
    PRIMARY KEY (receipt_id),
    CONSTRAINT fk_receipts_order
        FOREIGN KEY (order_id) REFERENCES orders (order_id)
        ON DELETE RESTRICT
        ON UPDATE RESTRICT
);

يمكنك ربط جدول ابن قائم بجدول أب عبر الأمر ALTER TABLE ... ADD CONSTRAINT fk_name FOREIGN KEY، كما يمكنك فك الارتباط وحذف القيد باستخدام اسمه الصريح عبر الصيغة ALTER TABLE ... DROP FOREIGN KEY fk_name:

SQL
ALTER TABLE orders
    DROP FOREIGN KEY fk_orders_customer;

ALTER TABLE orders
    ADD CONSTRAINT fk_orders_customer
        FOREIGN KEY (customer_id) REFERENCES customers (id)
        ON DELETE RESTRICT
        ON UPDATE CASCADE;

يقارن الجدول الشامل التالي بين أفعال التكامل المرجعي للمفاتيح الأجنبية في محرك InnoDB:

الإجراء المرجعيالأثر على صفوف الابن عند حذف الأبهل يشترط قبول NULL؟الحالة الهندسية الموصى بها
RESTRICT / NO ACTIONيمنع حذف الأب ويُرجع الخطأ 1451يقبل NOT NULLالعملاء أصحاب الفواتير والسجلات المالية
CASCADEيحذف جميع صفوف الابن المرتبطة تلقائياًيقبل NOT NULLبنود تفاصيل الطلب ورموز الجلسات المؤقتة
SET NULLيفرّغ عمود المفتاح الأجنبي في الابن إلى NULLيشترط السماح بـ NULLكاتب المقال أو الموظف المسؤول الاختياري

ملخص الدرس: أتقنت في هذا الدرس ربط الجداول العلائقية بقيد المفتاح الأجنبي FOREIGN KEY في محرك InnoDB، وشرط تطابق الأنواع وUNSIGNED، والفرق العملي بين RESTRICT وCASCADE وSET NULL.
الخطوة التالية والدرس القادم: انتقل الآن إلى الوحدة السادسة (عمليات البيانات CRUD) بدءاً من درس «إدراج السجلات المفردة والمتعددة بأمر INSERT في MySQL».

خلاصة المعرفة ومحطة الانتقال

ملخص الدرس

حصاد الدرس

مراجعة مركّزة لأهم المفاهيم والقواعد الهندسية التي أتقنتها في هذا الدرس قبل التطبيق العملي

ماذا تعلّمت في هذا الدرس؟

أتممت بهذا الدرس وحدة قيود الجداول الكاملة (NOT NULL وDEFAULT وUNIQUE وPRIMARY KEY وCHECK وFOREIGN KEY). الخطوة التالية: انتقل إلى درس «إدراج السجلات المفردة والمتعددة بأمر INSERT في MySQL».

مشاركة

هل كان هذا الدرس مفيدًا؟

جارٍ تحميل الآراء…

ابنِ لغتك البرمجية

المصطلحات5

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 5 مفهومةأول بطاقة، أول خطوة
01 Foreign Key المفتاح الأجنبي
تعلّم قيد المفتاح الأجنبي FOREIGN KEY والتكامل المرجعي بأسلوب MySQL 8 الحديث مع أمثلة استعلامات SQL وتطبيقات تفاعلية.
للمراجعة
02 Parent Child FOREIGN KEY Links ربط الجداول بقيد FOREIGN KEY
المفهوم الهندسي والصياغة العملية الخاصة بقسم ربط الجداول بقيد FOREIGN KEY في MySQL 8.
للمراجعة
03 Referential Integrity in InnoDB التكامل المرجعي في محرك InnoDB
المفهوم الهندسي والصياغة العملية الخاصة بقسم التكامل المرجعي في محرك InnoDB في MySQL 8.
للمراجعة
04 CASCADE and SET NULL Actions أفعال CASCADE و SET NULL
المفهوم الهندسي والصياغة العملية الخاصة بقسم أفعال CASCADE و SET NULL في MySQL 8.
للمراجعة
05 RESTRICT and NO ACTION Guards المنع الصارم بـ RESTRICT
المفهوم الهندسي والصياغة العملية الخاصة بقسم المنع الصارم بـ RESTRICT في MySQL 8.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

حروف قليلة. معنى كامل.

الاختصارات4

راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.

0 / 4 مفهومةأول بطاقة، أول خطوة
01 FK FK
Foreign Key Constraint
قيد المفتاح الأجنبي في الجدول الابن الذي يشير إلى المفتاح الأساسي أو الفريد في الجدول الأب.
للمراجعة
02 RI RI
Referential Integrity
ضمانة التكامل المرجعي في محرك InnoDB التي تمنع وجود سجلات أبناء تشير إلى آباء غير موجودين.
للمراجعة
03 PK PK
Primary Key (Referenced Parent Key)
المفتاح الأساسي في الجدول الأب الذي تستهدفه أعمدة المفاتيح الأجنبية في الجداول التابعة.
للمراجعة
04 DDL DDL
Data Definition Language
أوامر تعريف بنية الجداول المستخدمة لإنشاء وتعديل وحذف قيود المفاتيح الأجنبية.
للمراجعة

اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.

من الفهم للتطبيق

مهامك قبل الاختبار

خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.

0/2مهام منجزة
  1. نفّذ أمثلة SQL المشروحة في قسم ربط الجداول بقيد FOREIGN KEY داخل قاعدة بياناتك المحلية وتحقق من النتيجة.

  2. بدّل بين الحالات التفاعلية في قسم التكامل المرجعي في محرك InnoDB وقارن كيف يعالج محرك MySQL 8 كل أمر.

تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.

مساحة التحدي

اختبر فهمك.
ووصلها للإتقان.

كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.

5أسئلة 2أنواع تحديات 100%هدف الإتقان
تصحيح تلقائي. فرص بلا حدود.

أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.

الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.

لمحة عن التحدي5 أسئلة تنتظرك
01

إذا كان عمود المفتاح الأساسي في الجدول الأب من نوع BIGINT UNSIGNED، فكيف يجب تعريف عمود المفتاح الأجنبي في الجدول الابن؟

يشترط محرك InnoDB التطابق التام في نوع البيانات والحجم وخاصية UNSIGNED (أي BIGINT UNSIGNED).

02

أي إجراء مرجعي يقوم تلقائياً بحذف جميع صفوف الابن المرتبطة فور حذف السجل الأب؟

يقوم الخيار ON DELETE CASCADE بتمرير الحذف تلقائياً إلى جميع السجلات التابعة في الجدول الابن.

03

لاستخدام الإجراء ON DELETE SET NULL على عمود مفتاح أجنبي، يجب أن يكون العمود في الجدول الابن قابلاً للفراغ (NULL) وليس NOT NULL.

صواب؛ لا يمكن لمحرك InnoDB وضع القيمة NULL في عمود الابن عند حذف الأب إلا إذا كان العمود يسمح بـ NULL.

04

ما السلوك الافتراضي عند الحذف (ON DELETE) في محرك InnoDB إذا لم تكتب جملة ON DELETE صراحةً؟

السلوك الافتراضي هو RESTRICT (المطابق لـ NO ACTION)، حيث يمنع حذف الأب طالما له أبناء مرتبطون.

05

أي أمر SQL يحذف قيد المفتاح الأجنبي المسمى fk_orders_customer من جدول orders؟

يُستخدم الأمر ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer لحذف قيد المفتاح الأجنبي.