اضمن الاتساق بين جداولك باستخدام REFERENCES واختر عمدًا سلوك ON DELETE.
افتح هذا الدرس في Kodokonيعلن المفتاح الخارجي أن عمودًا يشير إلى المفتاح الأساسي لجدول آخر. عندئذٍ ترفض قاعدة البيانات أيّ قيمة يتيمة: فلا يمكنك إنشاء كتاب لا وجود لمؤلفه. انتبه، ففي SQLite يكون هذا التحقّق معطَّلًا افتراضيًا: فعِّله باستخدام PRAGMA في أعلى سكربتك.
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);اختبر الحماية: أدرج كتابًا يتيمًا، ثم احذف مؤلفًا. تُرفض التعليمة الأولى؛ أما الثانية فتأخذ معها كتبها بفضل ON DELETE CASCADE.
INSERT INTO books (id, title, author_id)
VALUES (4, 'Orphan', 99);
DELETE FROM authors WHERE id = 1;
SELECT id, title FROM books;يحدّد ON DELETE مصير الصفوف الأبناء عندما يختفي الأب. تحذفها CASCADE معه. وتحتفظ SET NULL بالصف لكنها تمسح المرجع - لذا يجب أن يقبل العمود NULL. ودون أيّ جملة، تطبّق SQLite NO ACTION: فيُرفض حذف الأب ما دام هناك أبناء، وهو سلوك قريب من RESTRICT.
CREATE TABLE articles (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL,
reviewer_id INTEGER
REFERENCES authors(id)
ON DELETE SET NULL
);