约束与外键
掌握 UNIQUE、CHECK、FOREIGN KEY、级联操作
约束与外键
约束是数据库最后一道防线——它拒绝不合法的数据进入表中,比应用层校验更可靠。
学完本章你将: 掌握 UNIQUE、CHECK、FOREIGN KEY、级联操作。
常用约束
sql
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL, -- 不能为 NULL
email TEXT UNIQUE, -- 不能重复
age INTEGER CHECK (age >= 18), -- 必须 >= 18
status TEXT DEFAULT 'active' -- 默认值
);
FOREIGN KEY —— 引用完整性
外键确保引用的数据真实存在——不会出现"订单属于一个不存在的用户":
sql
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
amount REAL,
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- user_id 的值必须在 users.id 中存在
⚠️ SQLite 默认不强制外键!需要执行
PRAGMA foreign_keys = ON;开启。
级联操作
sql
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id)
ON DELETE CASCADE -- 用户删了 → 他的订单也删
ON UPDATE CASCADE -- 用户 id 变了 → 订单 user_id 跟着变
);
级联选项:CASCADE(联动)、SET NULL(置空)、RESTRICT(禁止)、NO ACTION。
给已有表加约束
sql
ALTER TABLE orders ADD FOREIGN KEY (user_id) REFERENCES users(id);