在 SQLite 中,外键约束可以控制当主表中的记录被删除时,从表中相关联的记录应该如何处理。这通过在定义外键时使用 ON DELETE 子句来实现。
常用的 ON DELETE 选项有:
RESTRICT:默认行为,如果从表中有关联记录,主表记录不能被删除
CASCADE:删除主表记录时,自动删除从表中所有关联的记录
SET NULL:删除主表记录时,将从表中关联字段的值设为 NULL(要求从表字段允许为 NULL)
SET DEFAULT:删除主表记录时,将从表中关联字段设为默认值
NO ACTION:与 RESTRICT 类似,但检查时机不同
下面是一个示例,展示如何创建带有外键删除约束的表:
sql
-- 主表:用户表
CREATE TABLE users (
user_id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL
);
-- 从表:订单表,带有外键约束
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
order_date TEXT NOT NULL,
-- 外键约束,当用户被删除时,相关订单也被删除
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);
在这个例子中,当删除 users 表中的某个用户时,orders 表中所有属于该用户的订单会被自动删除(因为使用了 ON DELETE CASCADE)。
如果要使用其他删除策略,可以修改 ON DELETE 后面的关键字:
sql
-- 使用 SET NULL 策略
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
order_date TEXT NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE SET NULL
);
注意:SQLite 默认情况下外键约束是禁用的,需要先启用才能生效:
sql
PRAGMA foreign_keys = ON;
你需要在每次连接到数据库后执行这个命令来启用外键约束。