PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

3.3. 外键 #

回想 Chapter 2 中创建的 weather 与 cities 表。考虑以下实际业务痛点:你希望确保任何人都无法向 weather 天气表中插入一个在 cities 城市表中根本不存在的城市记录。这种约束机制在数据库理论中被称为维护数据的引用完整性(referential integrity)。在简陋的数据库系统中,这通常需要业务层自行先去查询 cities 表核实记录是否存在,随后再决定是否执行插入。这种方式不仅繁琐低效,而且在并发环境下极易产生脏数据。PostgreSQL 原生支持通过外键约束自动替你完成这一保障。

优化后的建表定义如下:

CREATE TABLE cities (
        name     varchar(80) primary key,
        location point
);

CREATE TABLE weather (
        city      varchar(80) references cities(name),
        temp_lo   int,
        temp_hi   int,
        prcp      real,
        date      date
);

现在尝试插入一条城市未在表中注册的非法数据:

INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');

ERROR:  insert or update on table "weather" violates foreign key constraint "weather_city_fkey"
DETAIL:  Key (city)=(Berkeley) is not present in table "cities".

外键约束的级联行为还可以根据具体的业务需求进行精细配置。本快速教程仅做基础引导,关于外键的级联更新、级联删除等高级用法,请参阅 Chapter 5。合理规范地引入外键能极大地提升数据库的数据质量与一致性,强烈建议深入掌握。