SQL 外键Foreign Key全解析

2025-05-15 02:50

本文主要是介绍SQL 外键Foreign Key全解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SQL外键ForeignKey全解析》外键是数据库表中的一列(或一组列),用于​​建立两个表之间的关联关系​​,外键的值必须匹配另一个表的主键(PrimaryKey)或唯一约束(UniqueCo...

1. 什么是外键?​​ ​

  • 定义​​:外键是数据库表中的一列(或一组列),用于​​javascript建立两个表之间的关联关系​​。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Constraint)的值。
  • ​​作用​​:
    • 确保数据的​​引用完整性​​(Referential Integrity),防止无效数据插入。
    • 维护表之间的逻辑关系(如“一对多”或“多对多”)。

​​2. 外键的语法​​

在创建表时定义外键:

CREATE TABLE 子表 (
   http://www.chinasem.cn 列1 数据类型,
    列2 数据类型,
    ...
    FOREIGN KEY (外键列) REFERENCES 父表(主键列)
    [ON DELETE 约束行为] [ON UPDATE 约束行为]
);

在已有表中添加外键:

ALTER TABLE 子表
ADD CONSTRAINT 约束名称
FOREIGN KEY (外键列) REFERENCES 父表(主键列)
[ON DELETE 约束行为] [ON UPDATE 约束行为];

​​3. 外键的约束行为​​

当父表的记录被删除或更新时,子表的外键如何处理?通过 ON DEChina编程LETE 和 ON UPDATE 指定:

约束行为说明
​CASCADE​级联操作。父表删除/更新记录时,子表关联记录也被删除/更新。
​SET NULL​父表删除/更新记录时,子表的外键列设为 NULL(要求外键列允许 NULL)。
​NO ACTION​默认行为。阻止父表的删除/更新操作,如果子表存在关联记录。
​RESTRICT​类似 NO ACTION,立即检查约束。
​SET DEFAULT​父表删除/更新记录时,子表的外键设为默认值(需定义默认值)。

​​4. 多列外键​​

外键可以由多个列组成,需满足:

  • 子表和父表的列数、顺序、数据类型一致。
  • 父表的列必须有唯一约束(如主键或唯一索引)。

​示例​​:

CREATE TABLE 订单详情 (
    订单ID INT,
    产品ID INT,
    数量 INT,
    PRIMARY KEY (订单ID, 产品ID),
    FOREIGN KEY (订单ID) REFERENCES 订单(订单ID),
    FOREIGN KEY (产品ID) REFERENCES 产品(产品ID)
);

​​5. 外键的限制与注意事项​​ ​

  • 父表必须有主键或唯一约束​​。
  • ​外键列的数据类型必须与父表主键一致​​。
  • ​引擎支持​​:如 mysql 的 InnoDB 支持外键,而 MyISAM 不支持。
  • ​性能影响​​:外键会增加数据操作的检查开销,但能提升数据一致性。
  • ​循环依赖​​:避免两个表互相引用。

​​6. 实际应用示例​​

​场景​​:学生表(students)和课程表(courses),通过选课表(enrollments)关联。

-- 父表:学生表
CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50)
);
-- 父表:课程表
CREATE TABLE courses (
    course_id INT PRIMARY KEY,
    course_name VARCHAR(50)
);
-- 子表:选课表(含外键)
CREATE TABLE enrollments (
    student_id INT,
    course_id INT,
    enrollment_date China编程DATE,
    FOREIGN KEY (student_id) REFERENCES students(student_id) ON DELETE CASCADE,
    FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE RESTRICT
);

​插入数据​​:

-- 插入学生和课程
INSERT INTO students VALUES (1, 'Alice');
INSERT INTO courses VALUES (101, 'Math');
-- 合法插入:学生和课程存在
INSERT INTO enrollments VALUES (1, 101, '2023-10-01');
-- 非法插入:学生不存在,触发外键错误
INSERT INTO enrollments VALUES (999, 101, '2023-10-01'); -- 报错!

​​7. 常见问题​​

​外键必须指向主键吗?​
不,可以指向父表的唯一约束(Unique Constraint)。

​能否跨数据库引用?​
通常不支持,外键需在同一数据库内。

​外键是否允许 NULL?​
如果外键列允许 NULL,则插入 NULL 是合法的(表示无关联)。

​如何查看外键约束?​
使用数据库工具或查询元数据(如 MySQL 的 SHOW CREATE TABLE)。

​​8. 总结​​ ​

  • 外键的核心作用​​:维护数据的一致性和关联性。​
  • 适用场景​​:需要强数据完整性的系统(如电商、金融)。​
  • 慎用场景​​:高并发写入且对性能要求极高的系统(需权衡一致性与性能)。

到此这篇关于SQL 外键(Foreign Key)详细讲解的文章就介绍到这了,更多相关SQL 外键Foreign Key内容请搜索编程China编程(www.javascriptchinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于SQL 外键Foreign Key全解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1154636

相关文章

Java进行日期解析与格式化的实现代码

《Java进行日期解析与格式化的实现代码》使用Java搭配ApacheCommonsLang3和Natty库,可以实现灵活高效的日期解析与格式化,本文将通过相关示例为大家讲讲具体的实践操作,需要的可以... 目录一、背景二、依赖介绍1. Apache Commons Lang32. Natty三、核心实现代

使用Python自动化生成PPT并结合LLM生成内容的代码解析

《使用Python自动化生成PPT并结合LLM生成内容的代码解析》PowerPoint是常用的文档工具,但手动设计和排版耗时耗力,本文将展示如何通过Python自动化提取PPT样式并生成新PPT,同时... 目录核心代码解析1. 提取 PPT 样式到 jsON关键步骤:代码片段:2. 应用 JSON 样式到

MySQL精准控制Binlog日志数量的三种方案

《MySQL精准控制Binlog日志数量的三种方案》作为数据库管理员,你是否经常为服务器磁盘爆满而抓狂?Binlog就像数据库的“黑匣子”,默默记录着每一次数据变动,但若放任不管,几天内这些日志文件就... 目录 一招修改配置文件:永久生效的控制术1.定位my.cnf文件2.添加核心参数不重启热更新:高手应

Maven 插件配置分层架构深度解析

《Maven插件配置分层架构深度解析》:本文主要介绍Maven插件配置分层架构深度解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Maven 插件配置分层架构深度解析引言:当构建逻辑遇上复杂配置第一章 Maven插件配置的三重境界1.1 插件配置的拓扑

MySQL中SQL的执行顺序详解

《MySQL中SQL的执行顺序详解》:本文主要介绍MySQL中SQL的执行顺序,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql中SQL的执行顺序SQL执行顺序MySQL的执行顺序SELECT语句定义SELECT语句执行顺序总结MySQL中SQL的执行顺序

MySQL中like模糊查询的优化方案

《MySQL中like模糊查询的优化方案》在MySQL中,like模糊查询是一种常用的查询方式,但在某些情况下可能会导致性能问题,本文将介绍八种优化MySQL中like模糊查询的方法,需要的朋友可以参... 目录1. 避免以通配符开头的查询2. 使用全文索引(Full-text Index)3. 使用前缀索

MySQL中的两阶段提交详解(2PC)

《MySQL中的两阶段提交详解(2PC)》:本文主要介绍MySQL中的两阶段提交(2PC),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言两阶段提交过程sync_binlog配置innodb_flush_log_at_trx_commit配置总结引言在Inn

Docker安装MySQL镜像的详细步骤(适合新手小白)

《Docker安装MySQL镜像的详细步骤(适合新手小白)》本文详细介绍了如何在Ubuntu环境下使用Docker安装MySQL5.7版本,包括从官网拉取镜像、配置MySQL容器、设置权限及内网部署,... 目录前言安装1.访问docker镜像仓库官网2.找到对应的版本,复制右侧的命令即可3.查看镜像4.启

MySQL中隔离级别的使用详解

《MySQL中隔离级别的使用详解》:本文主要介绍MySQL中隔离级别的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录引言undo log的作用MVCC的实现有以下几个重要因素如何根据这些因素判断数据值?可重复读和已提交读区别?串行化隔离级别的实现幻读和可

MySQL连接池(Pool)常用方法详解

《MySQL连接池(Pool)常用方法详解》本文详细介绍了MySQL连接池的常用方法,包括创建连接池、核心方法连接对象的方法、连接池管理方法以及事务处理,同时,还提供了最佳实践和性能提示,帮助开发者构... 目录mysql 连接池 (Pool) 常用方法详解1. 创建连接池2. 核心方法2.1 pool.q