Kodokon kodokon.com

المفاتيح الخارجية والتكامل المرجعي

اضمن الاتساق بين جداولك باستخدام REFERENCES واختر عمدًا سلوك ON DELETE.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

يعلن المفتاح الخارجي أن عمودًا يشير إلى المفتاح الأساسي لجدول آخر. عندئذٍ ترفض قاعدة البيانات أيّ قيمة يتيمة: فلا يمكنك إنشاء كتاب لا وجود لمؤلفه. انتبه، ففي SQLite يكون هذا التحقّق معطَّلًا افتراضيًا: فعِّله باستخدام PRAGMA في أعلى سكربتك.

SQL
PRAGMA foreign_keys = ON;

CREATE TABLE authors (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL
);

CREATE TABLE books (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  author_id INTEGER NOT NULL
    REFERENCES authors(id)
    ON DELETE CASCADE
);

INSERT INTO authors (id, name) VALUES
  (1, 'Ursula K. Le Guin'),
  (2, 'Ted Chiang');

INSERT INTO books (id, title, author_id) VALUES
  (1, 'A Wizard of Earthsea', 1),
  (2, 'The Dispossessed', 1),
  (3, 'Exhalation', 2);
يربط REFERENCES بين books.author_id وauthors.id.

اختبر الحماية: أدرج كتابًا يتيمًا، ثم احذف مؤلفًا. تُرفض التعليمة الأولى؛ أما الثانية فتأخذ معها كتبها بفضل ON DELETE CASCADE.

SQL
INSERT INTO books (id, title, author_id)
VALUES (4, 'Orphan', 99);

DELETE FROM authors WHERE id = 1;

SELECT id, title FROM books;
يفشل الإدراج؛ وبعد DELETE، لا يبقى سوى Exhalation.

يحدّد ON DELETE مصير الصفوف الأبناء عندما يختفي الأب. تحذفها CASCADE معه. وتحتفظ SET NULL بالصف لكنها تمسح المرجع - لذا يجب أن يقبل العمود NULL. ودون أيّ جملة، تطبّق SQLite NO ACTION: فيُرفض حذف الأب ما دام هناك أبناء، وهو سلوك قريب من RESTRICT.

SQL
CREATE TABLE articles (
  id INTEGER PRIMARY KEY,
  title TEXT NOT NULL,
  reviewer_id INTEGER
    REFERENCES authors(id)
    ON DELETE SET NULL
);
رابط اختياري: إذا غادر المراجِع، يبقى المقال.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. مع ON DELETE CASCADE على books.author_id، ماذا يسبّب DELETE FROM authors WHERE id = 1؟
    • خطأً ما دام للمؤلف كتب
    • حذف المؤلف وكل كتبه
    • تعيين author_id إلى NULL في كتبه
  2. لماذا نُنفِّذ PRAGMA foreign_keys = ON; في SQLite؟
    • لإنشاء المفاتيح الخارجية
    • لأن التحقّق من المفاتيح الخارجية معطَّل افتراضيًا، اتصالًا اتصالًا
    • لتسريع عمليات الربط
  3. ما الشرط الذي يجب أن يستوفيه العمود reviewer_id لاستخدام ON DELETE SET NULL؟
    • أن يكون مُصرَّحًا به UNIQUE
    • أن يكون من النوع INTEGER
    • أن يقبل NULL، أي ألّا يحمل NOT NULL