外键
PostgreSQL 中的外键是什么?
外键要求一张表中的值必须与另一张表中的某一行匹配,因此无法指向不存在的行。ON DELETE 决定被引用的行被删除时如何处理。
外键约束规定某一列(或一组列)中的值必须与另一张表中某一行的值相匹配。它让相关的表保持一致:指向不存在的行的插入或更新会被拒绝。
被引用的列必须是主键或具有唯一约束。当被引用的行被删除时,由 ON DELETE 动作决定后续处理:NO ACTION(默认)和 RESTRICT 会拒绝删除,CASCADE 会同时删除引用它的行,SET NULL 或 SET DEFAULT 则会修改这些行。PostgreSQL 不会自动为引用列创建索引,在这些列上添加索引通常是值得的。
示例
该示例使用 ON DELETE CASCADE 将 invoices 关联到 customers。删除客户时也会删除其发票,因此最终计数为 0。
CREATE TABLE customers (id int PRIMARY KEY, name text NOT NULL);
CREATE TABLE invoices (
id int PRIMARY KEY,
customer_id int NOT NULL REFERENCES customers (id) ON DELETE CASCADE,
amount numeric NOT NULL
);
INSERT INTO customers VALUES (1, 'Acme');
INSERT INTO invoices VALUES (10, 1, 99.50);
DELETE FROM customers WHERE id = 1;
SELECT count(*) FROM invoices;适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。