Z
ZHANK
表设计与索引

约束与外键

掌握 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);