في هذا الدرس 6تصفّح المواضيع
يربط قيد المفتاح الأجنبي FOREIGN KEY عموداً داخل الجدول الابن (مثل orders.customer_id) بالمفتاح الأساسي أو الفريد في الجدول الأب (مثل customers.id). ويفرض محرك InnoDB التكامل المرجعي (Referential Integrity) بحيث يستحيل تسجيل طلب لعميل غير موجود أصلاً (Error 1452):
- الجدول الأب (Parent Table): الجدول المرجعي الذي يحتوي على المفتاح الأساسي الأصلي (
customers). - الجدول الابن (Child Table): الجدول التابع الذي يضم عمود المفتاح الأجنبي المرتبط بالأب (
orders).
CREATE TABLE customers (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
full_name VARCHAR(100) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE orders (
order_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
customer_id BIGINT UNSIGNED NOT NULL,
PRIMARY KEY (order_id),
CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id) REFERENCES customers (id)
);
عند تفعيل قيد FOREIGN KEY، يحرس محرك InnoDB العلاقة في الاتجاهين مع كل عملية كتابة أو تعديل:
- حراسة الجدول الابن (خطأ 1452): يمنع إضافة سجل ابن يشير إلى رقم أب غير موجود في الجدول الأب.
- حراسة الجدول الأب (خطأ 1451): يمنع حذف سجل الأب أو تغيير معرّفه بطريقة تترك سجلات أبناء يتيمة (Orphan Rows)، وذلك وفق الإجراء المحدد في جملتي
ON DELETEوON UPDATE.
يمكنك توجيه محرك InnoDB لتنفيذ إجراء تلقائي على سجلات الابن عند حذف السجل الأب أو تحديث مفتاحه:
- الحذف المتسلسل
ON DELETE CASCADE: يحذف تلقائياً جميع سجلات الابن المرتبطة فور حذف السجل الأب (مناسب للبيانات التابعة كلياً مثل بنود الفاتورة أو جلسات الدخول). - تفريغ المرجع
ON DELETE SET NULL: يحوّل قيمة المفتاح الأجنبي في الابن إلىNULLعند حذف الأب مع الإبقاء على سجل الابن محفوظاً. تنبيه: يشترط هذا الخيار أن يكون عمود الابن قابلاً للفراغ (NULLوليسNOT NULL).
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)، مما يحمي السجلات المالية والفواتير التاريخية من الحذف المتسلسل غير المقصود:
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:
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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
راجع المعنى، اشرحه لنفسك، ثم علّم البطاقة كمفهومة.
- 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
- أوامر تعريف بنية الجداول المستخدمة لإنشاء وتعديل وحذف قيود المفاتيح الأجنبية.
- للمراجعة
لا توجد بطاقات تطابق البحث والتصفية.
اقرأ البطاقات بحرية. سجّل الدخول لحفظ تقدم مراجعتك.
مهامك قبل الاختبار
خطوة صغيرة كل مرة. وإنجاز تقدر ترجع له.
-
نفّذ أمثلة SQL المشروحة في قسم ربط الجداول بقيد FOREIGN KEY داخل قاعدة بياناتك المحلية وتحقق من النتيجة.
-
بدّل بين الحالات التفاعلية في قسم التكامل المرجعي في محرك InnoDB وقارن كيف يعالج محرك MySQL 8 كل أمر.
تأشير المهمة إقرار منك بإتمامها، وليس تصحيحًا آليًا للكود. يُحفظ تقدمك في حسابك.
اختبر فهمك.
ووصلها للإتقان.
كل سؤال خطوة لقدّام. اختار، اكتب كود، وشوف نتيجتك فورًا.
أكمل المهام، واجمع كل الإجابات الصحيحة. أقل من 100%؟ راجع وأعد المحاولة.
الأسئلة متاحة للاطلاع. سجّل الدخول للتفاعل وحفظ تقدمك.
لمحة عن التحدي5 أسئلة تنتظرك +
إذا كان عمود المفتاح الأساسي في الجدول الأب من نوع BIGINT UNSIGNED، فكيف يجب تعريف عمود المفتاح الأجنبي في الجدول الابن؟
يشترط محرك InnoDB التطابق التام في نوع البيانات والحجم وخاصية UNSIGNED (أي BIGINT UNSIGNED).
أي إجراء مرجعي يقوم تلقائياً بحذف جميع صفوف الابن المرتبطة فور حذف السجل الأب؟
يقوم الخيار ON DELETE CASCADE بتمرير الحذف تلقائياً إلى جميع السجلات التابعة في الجدول الابن.
لاستخدام الإجراء ON DELETE SET NULL على عمود مفتاح أجنبي، يجب أن يكون العمود في الجدول الابن قابلاً للفراغ (NULL) وليس NOT NULL.
صواب؛ لا يمكن لمحرك InnoDB وضع القيمة NULL في عمود الابن عند حذف الأب إلا إذا كان العمود يسمح بـ NULL.
ما السلوك الافتراضي عند الحذف (ON DELETE) في محرك InnoDB إذا لم تكتب جملة ON DELETE صراحةً؟
السلوك الافتراضي هو RESTRICT (المطابق لـ NO ACTION)، حيث يمنع حذف الأب طالما له أبناء مرتبطون.
أي أمر SQL يحذف قيد المفتاح الأجنبي المسمى fk_orders_customer من جدول orders؟
يُستخدم الأمر ALTER TABLE orders DROP FOREIGN KEY fk_orders_customer لحذف قيد المفتاح الأجنبي.