首页/数据/SQL 速查/外键创建与级联选项
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条函数速查60 条
变更与事务52 条
性能与执行计划72 条

外键创建与级联选项

用外键表达引用完整性:ON DELETE/UPDATE 决定父行变化时子行行为;外键列要建索引,写入路径也要评估锁影响。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
ALTER TABLE orders
  ADD CONSTRAINT fk_orders_user
  FOREIGN KEY (user_id) REFERENCES users (id)
  ON DELETE CASCADE ON UPDATE RESTRICT;

-- 建前确认外键列索引(InnoDB 会自动创建,显式建更可控)
ALTER TABLE orders ADD INDEX idx_user_id (user_id);

PostgreSQL

PostgreSQL
ALTER TABLE orders
  ADD CONSTRAINT fk_orders_user
  FOREIGN KEY (user_id) REFERENCES users (id)
  ON DELETE CASCADE ON UPDATE RESTRICT
  DEFERRABLE INITIALLY IMMEDIATE;   -- 需要时可延迟到提交时校验
级联选项RESTRICT/NO ACTION 拒绝、CASCADE 跟随、SET NULL 置空(列需可空)
索引父表被引用列需唯一;子表外键列建议建索引
跨库限制外键不能跨实例或分库,分片场景改用应用层保证

易错点

  • 生产大表随手加外键:校验与锁开销进入写入路径,先评估业务必要性
  • CASCADE 用顺手:父行删除会连带删除子行数据,确认业务语义再启用

数据来源与参考

  • MySQL 8.0 Reference Manual · FOREIGN KEY Constraints
  • PostgreSQL Documentation · Foreign Keys
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌