用 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
);