当前位置: 首页 > news >正文

SQL示例:外键约束是关系型数据库中用于建立两个表之间链接的一种规则

本文介绍了在SQL中创建外键约束的方法,以audit表的EMP_no字段关联employees_test表的主键ID为例。


通过ALTER TABLE语句添加外键约束,确保audit表中的每个EMP_no值都存在于employees_test表的ID中。


文章解释了外键约束的作用是维护数据一致性,防止插入无效数据或误删被引用数据,并区分了外键约束与连表查询的不同用途。


外键约束是数据写入时的保护机制,而非查询的前提条件,适用于需要严格数据完整性的场景,但对性能要求高的场景可能不适用。


SQL示例

题目描述

在audit表上创建外键约束,其emp_no对应employees_test表的主键id。

(以下2个表已经创建了)

CREATE TABLE employees_test( ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE INT NOT NULL, ADDRESS CHAR(50), SALARY REAL ); CREATE TABLE audit( EMP_no INT NOT NULL, create_date datetime NOT NULL );

后台会判断是否创建外键约束,创建输出1,没创建输出0

解法

可以使用ALTER TABLE语句添加外键约束:

ALTER TABLE audit ADD CONSTRAINT fk_audit_emp_no FOREIGN KEY (EMP_no) REFERENCES employees_test(ID);

如果只需要最简形式(系统自动生成约束名)

ALTER TABLE audit ADD FOREIGN KEY (EMP_no) REFERENCES employees_test(ID);

注意事项:

  1. 外键约束要求employees_test表中的ID字段必须是主键(已满足)

  2. 要求audit表中的EMP_no字段类型与employees_test表的ID字段类型兼容(都是整型,已满足)


外键约束是关系型数据库中用于建立两个表之间链接的一种规则


它确保一个表中的数据与另一个表中的数据保持一致性和完整性。


通俗理解

可以把外键理解为一种"引用"关系。例如:

  • 主表(被引用的表):employees_test(员工表),ID是主键

  • 从表(引用别人的表):audit(审计表),EMP_no是外键


外键约束的意思是:audit表中的EMP_no字段的每一个值,都必须在employees_test表的ID字段中存在


具体作用

1. 保证数据一致性

sql

-- 如果 employees_test 表中没有 ID=999 的员工 INSERT INTO audit (EMP_no, create_date) VALUES (999, NOW()); -- 外键约束会阻止这条插入,因为 999 不存在于主表中

2. 防止删除被引用的数据

sql

-- 如果 audit 表中还有某个 EMP_no 的记录 DELETE FROM employees_test WHERE ID = 10001; -- 外键约束会阻止删除(除非设置了级联删除)

三种常见行为

行为说明
RESTRICT有引用时禁止删除/更新主表记录
CASCADE主表删除/更新时,从表同步删除/更新
SET NULL主表删除/更新时,从表外键设为 NULL

你题目中的例子

sql

ALTER TABLE audit ADD FOREIGN KEY (EMP_no) REFERENCES employees_test(ID);

这条语句的含义:

  • audit表中的每条记录,都必须对应一个真实存在的员工

  • 不能为不存在的员工创建审计记录

  • 不能随意删除还在审计表中留有记录的员工信息

简单记忆:外键就像是"查字典"——写进去的词,必须在字典里已经存在。


外键约束怎么用,是连表查询的时候用吗


需要澄清一个常见的误区:外键约束和连表查询是两件完全不同的事情

核心区别

外键约束连表查询 (JOIN)
作用保证数据完整性从多个表获取数据
使用时插入/更新/删除数据时自动生效查询数据时手动写SQL
是否必须可选,不是查询的前提需要时就用
关系约束规则查询技巧

外键约束的真正用途

外键约束是写数据时的保护机制,和查询无关:

sql

-- 1. 创建外键约束(建表时或后添加) CREATE TABLE orders ( order_id INT PRIMARY KEY, customer_id INT, FOREIGN KEY (customer_id) REFERENCES customers(id) ); -- 2. 约束会在插入时自动检查 INSERT INTO orders (customer_id) VALUES (999); -- ❌ 如果 customers 表没有 id=999,会被拒绝 -- 3. 约束会在删除时自动检查 DELETE FROM customers WHERE id = 1; -- ❌ 如果 orders 表还有该客户的订单,会被拒绝

连表查询不需要外键约束

即使没有外键约束,也能正常连表查询:

sql

-- 没有外键约束,照样可以 JOIN SELECT * FROM audit a JOIN employees_test e ON a.EMP_no = e.ID;

外键约束不是连表查询的前提条件,只要两个表有逻辑关联的字段(哪怕没有约束),就可以 JOIN。

什么时候用外键约束?

sql

-- ✅ 推荐使用外键约束的场景 -- 1. 订单系统的订单表引用用户表(不能有不存在的用户下单) -- 2. 评论表的文章ID引用文章表(不能有不存在的文章的评论) -- 3. 银行转账记录引用账户表(不能有无效账户的交易) -- ❌ 可以不用的场景 -- 1. 日志表(偶尔数据不一致影响不大) -- 2. 数据仓库/大数据场景(约束影响插入性能) -- 3. 分库分表的系统(跨库无法建外键)

总结

你想做什么需要外键约束吗?
查询两个表的数据❌ 不需要,直接用 JOIN
确保插入的数据是有效的✅ 需要,外键自动帮您检查
防止误删被引用的数据✅ 需要,外键会阻止或级联
提高查询性能❌ 不会,用索引来提速

一句话记住:外键约束是"守门员"(保护数据质量),不是"导航员"(查询数据不需要它)。

http://www.jsqmd.com/news/817101/

相关文章:

  • 如何成为低级程序员:lowlevelprogramming-university终极学习指南
  • 别再滥用虚函数了!用CRTP(奇异递归模板模式)在C++里实现零开销的静态多态
  • 天津婚姻财产律师哪家强?2026年天津婚姻财产律师推荐与评测,应对复杂财产界定与风险规避难题 - 外贸老黄
  • 2026年最实用的10个免费降AI率工具,前几款一键降低AI率! - 降AI实验室
  • Dockerfile ONBUILD指令风险解析:Hadolint DL3043规则深度指南 [特殊字符]
  • MAX30102功耗优化实战:用软件Proximity模式打造超长续航的可穿戴血氧仪(含ESP32/STM32例程)
  • 终极指南:如何通过co与RxJS集成实现响应式异步编程新范式
  • 从零开始的底层程序员养成计划:lowlevelprogramming-university完整攻略
  • Claude Code 用户如何迁移至 Taotoken 解决封号与额度焦虑
  • 终极OpenWrt网络加速方案:TurboACC插件完整配置指南
  • BlingFire多语言支持:如何在365种语言中实现快速文本处理 [特殊字符]
  • 逆天项目GitHub加速计划:从Java到易语言的1007种编程语言实现指南
  • 如何选择天津继承诉讼律师?2026年专业律师评测与推荐,直击流程不透明痛点 - 外贸老黄
  • Mentor-dft 进阶解析 day47-Graybox实战:从原理到Tessent OCC协同设计
  • 3步实现Windows智能安装安卓应用:告别笨重模拟器的高效方案
  • 一个10年测试老兵的自白:我为什么转型做DevOps?
  • 2026年5月最新越秀区黄金回收 无折旧费 24 小时上门 实秤实收 - MR四木
  • 别再瞎加密网格了!用Numeca AutoGrid5做叶轮机械CFD,这样验证网格无关性才靠谱
  • AI 开发者的困境:专有 AI 与开源生态系统
  • RISC-V架构实战指南:lowlevelprogramming-university完整教程带你掌握底层编程
  • CodeGuide反射机制:解锁Java动态编程的终极指南
  • 2026年4月优质的超声波清洗设备公司推荐,工业废水回收利用/超声波清洗设备,超声波清洗设备源头厂家推荐 - 品牌推荐师
  • ggshield蜜罐令牌:主动防御的高级安全策略终极指南
  • 2026 郑州黄金闲置处置 TOP5,本地 30 年老店清单,直接抄作业不踩雷 - 奢侈品回收测评
  • ARM64虚拟化实战:Proxmox-Arm64项目终极部署指南
  • 3大核心技术解密:Unlock Music如何打破12种音乐格式壁垒
  • MoneyPrinter终极性能测试指南:不同配置下的YouTube Shorts渲染速度对比分析 [特殊字符]
  • 毫米波雷达实战:如何精准测量与校准目标RCS
  • 有人开源了一个完全不用向量数据库的 RAG 系统,在财务问答上准确率达 98.7%
  • 终极MoneyPrinter前端交互设计:Web界面操作全解析