DBMS - 外键
外键允许我们在维护一致性和数据完整性的同时,在表之间创建有意义的关联关系。本章中,我们将通过示例和实际应用详细阐述外键的概念,帮助您全面理解外键及其应用方式。
什么是外键?
foreign key 是表中的一个属性或一组属性,它引用另一个表的主键。通过这种方式,它在两个表之间创建了链接。外键在维护关系结构和强制数据一致性方面非常有用。
想象我们有两个表 −
- STUDENT Table − (STUDENT_ID (Primary Key), NAME, ADDRESS, AGE, DOB)
- COURSES Table − (COURSE_NAME, INSTRUCTOR, REFERENCE_ID (Foreign Key))
在这个示例中,REFERENCE_ID 列是特殊的。在 COURSES 表中,它引用 STUDENT 表中的 STUDENT_ID 列。这种关系表明 COURSES 表中的任何课程记录都与 STUDENT 表中的一个有效学生相关联。
外键的重要性
外键在数据库管理中具有以下几个关键作用 −
- Data Integrity − 外键用于确保相关表中的数据保持一致。例如,如果一个课程通过外键引用一个学生,则该学生必须存在于 STUDENT 表中。如果有人试图删除或修改 COURSES 表中引用的学生记录,数据库会抛出错误。这就是维护数据完整性。
- Establishing Relationships − 外键的主要目的是链接表,从而帮助创建有意义的关联关系。例如,学生与特定课程的关联,或者订单与客户的关联。
- Avoiding Redundancy − 这是另一个原因。外键减少了数据重复的需求。我们无需在 COURSES 表中存储完整的学生详细信息,只需存储 REFERENCE_ID,它链接到 STUDENT 表中的 STUDENT_ID。
- Query Optimization − 在数据库设计中,使用外键可以优化查询执行。表之间的关系允许数据库引擎在复杂查询期间更有效地检索数据。
- Enforcing Business Rules − 通过使用外键,我们可以强制执行业务规则。这非常有趣。例如,如果从 STUDENT 表中删除一个学生,则 COURSES 表中与之关联的课程也必须被删除或失效。
创建和删除外键的语法
外键可以在创建表时定义,也可以在之后添加。让我们来看一些 SQL 语法 −
创建外键
让我们了解创建外键的过程 −
CREATE TABLE COURSES (
COURSE_NAME VARCHAR(20),
INSTRUCTOR VARCHAR(20),
REFERENCE_ID INT,
CONSTRAINT FK_REFER FOREIGN KEY (REFERENCE_ID)
REFERENCES STUDENT(STUDENT_ID)
);
在这个示例中,COURSES 表中的 REFERENCE_ID 列引用 STUDENT 表中的 STUDENT_ID 列。关键字 CONSTRAINT 用于命名外键约束。
删除外键
要移除外键,需要使用 ALTER TABLE 语句 −
ALTER TABLE COURSES DROP FOREIGN KEY FK_REFER;
此命令从 COURSES 表中删除名为 FK_REFER 的外键约束。
外键实现的总结
以下是实现外键的步骤总结 −
- 创建主键表 − 要创建外键,我们必须首先创建作为引用的表,并确保它具有 primary key。
- 定义外键表 − 创建包含外键列的表,该列引用第一个表的主键列。
- 测试关系 − 在两个表中插入数据并测试关系,以确保完整性得到维护。
- 删除或修改约束 − 使用 ALTER TABLE 命令在必要时更新或移除外键约束。
外键的真实世界示例
为了让这个概念更加清晰,让我们看看外键在 Student-Courses 数据库系统中的工作方式。
步骤 1: 创建数据库
首先,我们创建一个名为 MYDB 的新数据库 −
CREATE DATABASE MYDB; USE MYDB;
步骤 2: 创建表
接下来,我们创建 STUDENT 和 COURSES 表。
以下是 STUDENT 表 −
CREATE TABLE STUDENT (
STUDENT_ID INT PRIMARY KEY,
NAME VARCHAR(20),
ADDRESS VARCHAR(20),
AGE INT,
DOB DATE
);
以下是 COURSES 表 −
CREATE TABLE COURSES (
COURSE_NAME VARCHAR(20),
INSTRUCTOR VARCHAR(20),
REFERENCE_ID INT,
CONSTRAINT FK_REFER FOREIGN KEY (REFERENCE_ID)
REFERENCES STUDENT(STUDENT_ID)
);
步骤 3: 链接表
通过在 COURSES 表中使用 REFERENCE_ID 列,我们引用了 STUDENT 表中的 STUDENT_ID 列。我们在两个表之间建立了关系。这表明 COURSES 表中的每门课程都必须链接到一个现有的学生。
为什么 DBMS 中需要外键?
外键解决了数据库管理中的实际挑战。以下是 DBMS 中外键发挥重要作用的一些关键方面 −
- 确保数据一致性 − 外键防止数据不匹配。例如,我们不能为不存在于 STUDENT 中的学生添加课程。
- 简化数据管理 − 使用外键,数据更容易管理。与其在表之间重复相同的数据,我们维护关系并确保更新在单一位置进行。
- 防止未授权更改 − 外键通过防止未授权的删除或更新增加了一层安全性。例如,如果一个学生与课程相关联,则在解决关系之前,不能删除 STUDENT 表中的其记录。
自引用外键
外键也可以引用同一表内的列。这被称为 自引用外键。例如,在员工层级结构中,我们可能有一个表,其中每个员工都有一个 MANAGER_ID 列,该列引用同一表内的 EMPLOYEE_ID 列。
结论
在本文中,我们介绍了外键的工作原理以及它们在数据库中的重要性。我们探讨了外键如何在表之间建立关系并确保数据一致性。我们解释了创建和删除外键的语法,并通过真实世界示例演示了其应用。我们还考察了外键在维护数据完整性和减少冗余方面的重要性。