加载中...

| SQL 关键字 | FOREIGN KEY ... REFERENCES |
| 级联选项 | RESTRICT / CASCADE / SET NULL / NO ACTION |
| 支持引擎 | InnoDB(MySQL)、全部 PostgreSQL 表 |
外键(Foreign Key)解决的核心问题是数据一致性。比如订单表的 user_id 列引用用户表的 id,加了外键约束后,删除一个还有关联订单的用户就会被数据库阻止,而不是悄悄留下一堆指向不存在用户的订单行。
SQL 标准定义了三种处理方式:RESTRICT(直接报错)、CASCADE(连带删除/更新子行)、SET NULL(将子表外键列置为 NULL)。不同场景下选择哪种,直接决定了数据的级联行为。[1]
外键约束在每次 INSERT / UPDATE / DELETE 时都需要额外查询父表,对写密集型场景有可见的性能开销。这也是为什么 MySQL 的 MyISAM 引擎干脆不支持外键,而许多大型互联网公司选择在应用层自行保证引用完整性,数据库层面不加约束——换取更高的写吞吐和更灵活的分库分表能力。
PostgreSQL 对外键的支持最为完善,包括延迟检查(DEFERRABLE INITIALLY DEFERRED),允许在事务提交时才验证约束,适合批量数据导入。MongoDB 4.0 以后虽然加入了多文档事务,但原生无外键概念,引用完整性完全由应用层负责。

| SQL 关键字 | FOREIGN KEY ... REFERENCES |
| 级联选项 | RESTRICT / CASCADE / SET NULL / NO ACTION |
| 支持引擎 | InnoDB(MySQL)、全部 PostgreSQL 表 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧