候选键
在关系数据库中,能够唯一地标识一个元组的属性或属性的组合称为候选键(Candidate Key)。候选键可以有一个或多个。
候选键具有以下两个基本特性:
唯一性:在关系中,任意两个不同的元组,其候选键的取值都是不同的。也就是说,候选键的值不会重复。
最小性:候选键所包含的任意属性都不能从键中去除,否则将破坏其唯一性。这被称为最小性,简而言之,候选键中的每个属性都是必需的。
主键
当从多个候选键中选定一个作为区分元组的依据时,这个被选定的候选键就称为主键(Primary Key)。一个关系通常有且只有一个主键。
主键约束:主键列的值必须唯一且不能为空(NOT NULL)。
引用完整性:当另一个表中的属性(外键)引用主键时,外键的值必须在主键中存在,或者为空。
超键
在数据库中,能够唯一标识一个元组的属性或属性集合的全体称为超键(Super Key)。超键是比候选键更广泛的概念,一个候选键也是一个超键,但反之不一定成立。例如,在包含身份证号码和姓名两个属性的关系中,{身份证号码} 是候选键,而 {身份证号码, 姓名} 是超键,但因其包含了冗余属性 (姓名) 而不符合最小性要求,所以它不是候选键。
外键
外键(Foreign Key)是关系中的一个属性或属性组合,它在一个关系中引用另一个关系的主键。外键的存在保证了数据的一致性和完整性,使得不同表之间能够建立联系。例如,员工表中的部门编号(dept_id)通常引用部门表中的主键 id,这就使员工表与部门表之间形成了一种关联。
关系型数据库中键的对比
为了更清楚地理解“候选键”、“主键”和“超键”这些概念,下面以表格形式进行总结:
| 键类型 | 定义 | 唯一性 | 最小性 | 允许为空 | 示例 |
|---|---|---|---|---|---|
| 超键 | 能够唯一标识元组的属性集合 | 是 | 否 | 不一定 | (学号, 姓名) |
| 候选键 | 能唯一标识且没有冗余的超键 | 是 | 是 | 不一定 | 学号 |
| 主键 | 从候选键中选定的用于标识元组的键 | 是 | 是 | 否 | 学号(被选择作为主键) |
| 外键 | 引用另一张表主键的键 | 否 | 不一定 | 通常允许为空 | 课程表中的教师编号(引用教师表的主键) |
SQL 创建主键和外键的语法示例
以下以 MySQL 为例,展示如何在创建表时定义主键和外键:
-- 创建主键 CREATE TABLE students ( id INT NOT NULL, -- 不能为空 name VARCHAR(50), class_id INT, PRIMARY KEY (id) -- 将 id 设为表的主键 ); -- 创建外键:实现引用完整性 CREATE TABLE courses ( course_id INT NOT NULL, course_name VARCHAR(50), teacher_id INT, PRIMARY KEY (course_id), FOREIGN KEY (teacher_id) REFERENCES teachers(id) -- 外键约束 );
内联与外联查询中候选键/主键的应用
候选键或主键的应用不仅限于定义数据约束,它们还广泛用于表和表之间的连接操作中。例如,在如下 SQL 查询中:
-- 利用主键与外键进行内连接查询 SELECT students.name, courses.course_name FROM students JOIN course_enrollment ON students.id = course_enrollment.student_id -- id 是students表的主键 JOIN courses ON course_enrollment.course_id = courses.course_id; -- course_id 是courses表的主键
通过这样的键关系,我们可以高效、准确地连接不同的表,从而得到需要的数据结果。