0Pricing
SQL Academy · درس

FOREIGN KEY والإجراءات المرجعية

اربط الجداول باستخدام FOREIGN KEY، واختر ON DELETE CASCADE أو SET NULL أو RESTRICT للسلوك المناسب.

FOREIGN KEY والإجراءات المرجعية درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

ما الذي يفعله المفتاح الخارجي

يجعل FOREIGN KEY قاعدة البيانات ترفض الصفوف التي تشير إلى أصول غير موجودة:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL REFERENCES users(id),
  total NUMERIC(10,2) NOT NULL
);

-- Inserting an order with user_id=999 fails if no such user exists.

لماذا نستخدم المفاتيح الخارجية؟

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

  • لا توجد صفوف يتيمة
  • اكتشاف أخطاء التطبيق وقت الإدراج
  • جعل مخططات ER دقيقة
  • تمكين سلوك التتابع التلقائي

إجراءات الإسناد المرجعي

ماذا ينبغي أن يحدث عند حذف الصف الأصل أو تحديثه؟ هناك خمسة خيارات:

  • NO ACTION — خطأ (الافتراضي، قابل للتأجيل)
  • RESTRICT — خطأ (غير قابل للتأجيل)
  • CASCADE — احذف/حدّث التابع أيضًا
  • SET NULL — اضبط المفتاح الخارجي للتابع على NULL
  • SET DEFAULT — اضبط المفتاح الخارجي للتابع على قيمته الافتراضية

ON DELETE CASCADE

«عند حذف المستخدم، احذف طلباته أيضًا»:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  user_id BIGINT NOT NULL
    REFERENCES users(id) ON DELETE CASCADE,
  total NUMERIC(10,2) NOT NULL
);

ON DELETE SET NULL

«عند إزالة المدير، يبقى الموظفون موجودين لكن يفقدون مديرهم»:

CREATE TABLE employees (
  id BIGSERIAL PRIMARY KEY,
  full_name TEXT NOT NULL,
  manager_id BIGINT REFERENCES employees(id) ON DELETE SET NULL
);

الافتراضي: شبيه بـ RESTRICT

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

ERROR:  update or delete on table "users" violates foreign key constraint "orders_user_id_fkey" on table "orders"
DETAIL:  Key (id)=(42) is still referenced from table "orders".

افهرس عمود المفتاح الخارجي دائمًا

لا تنشئ PostgreSQL فهرسًا على جانب التابع تلقائيًا. أضف فهرسًا، فمن دونه يؤدي حذف أصل إلى فحص كامل لكل جدول تابع:

CREATE INDEX orders_user_id_idx ON orders(user_id);

مفاتيح خارجية مركبة

أشِر إلى مفتاح أساسي مركب:

CREATE TABLE order_items (
  order_id BIGINT,
  line_no INT,
  PRIMARY KEY (order_id, line_no)
);
CREATE TABLE shipments (
  order_id BIGINT,
  line_no INT,
  FOREIGN KEY (order_id, line_no)
    REFERENCES order_items(order_id, line_no)
);

تأجيل عمليات التحقق من المفاتيح الخارجية

قد تحتاج أحيانًا إلى إدراج زوج من الصفوف في حالة الدجاجة والبيضة. عيّن المفتاح الخارجي على DEFERRABLE INITIALLY DEFERRED:

ALTER TABLE orders
  ALTER CONSTRAINT orders_user_id_fkey DEFERRABLE INITIALLY DEFERRED;

BEGIN;
  INSERT INTO orders ... ;     -- FK temporarily not checked
  INSERT INTO users ... ;
COMMIT;                         -- checked here

إضافة المفاتيح الخارجية أثناء التشغيل

في الجداول الكبيرة، استخدم NOT VALID + VALIDATE لتجنب قفل طويل:

ALTER TABLE orders
  ADD CONSTRAINT orders_user_id_fkey
  FOREIGN KEY (user_id) REFERENCES users(id) NOT VALID;
ALTER TABLE orders VALIDATE CONSTRAINT orders_user_id_fkey;

استخدم CASCADE بحذر

تنتشر عمليات الحذف المتتابعة عند استخدام CASCADE. فقد يؤدي حذف مستخدم إلى حذف الطلبات والمدفوعات وسجلات التدقيق. تأكد من أن التتابع يطابق غرض عملك.

مراجعة

المفاتيح الخارجية حواجز أمان.

  • يعلن REFERENCES + الإجراء عن الرابط والسلوك
  • افهرس عمود المفتاح الخارجي في الجدول التابع
  • استخدم NOT VALID + VALIDATE عند الإضافة أثناء التشغيل

اختبار سريع

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

الأسئلة الشائعة

هل درس «FOREIGN KEY والإجراءات المرجعية» مجاني؟

نعم — نص درس «FOREIGN KEY والإجراءات المرجعية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «FOREIGN KEY والإجراءات المرجعية»؟

اربط الجداول باستخدام FOREIGN KEY، واختر ON DELETE CASCADE أو SET NULL أو RESTRICT للسلوك المناسب. تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «FOREIGN KEY والإجراءات المرجعية»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. قيود NOT NULL وCHECK
  2. قيود UNIQUE والمفاتيح المركبة
  3. FOREIGN KEY والإجراءات المرجعية
  4. القيم الافتراضية والأعمدة المُولَّدة
← العودة إلى SQL Academy