主键和外键是数据库设计中非常重要的概念,它们用于维护数据的完整性和一致性。以下是一个关于主键和外键的实例说明:
实例背景
假设我们有两个表:学生表(Student) 和 课程表(Course)。一个学生可以选修多门课程,但一门课程可以被多个学生选修。为了记录这种多对多的关系,我们还需要一个选课表(Enrollment)。
表结构
学生表(Student)
- StudentID(主键):学生的唯一标识,如学号。
- Name:学生的姓名。
- Age:学生的年龄。
CREATE TABLE student (
StudentID INT PRIMARY KEY,
Name VARCHAR(50) NOT NULL,
Age INT
);
课程表(Course)
- CourseID(主键):课程的唯一标识,如课程编号。
- CourseName:课程的名称。
- Credits:课程的学分。 不允许为空。
CREATE TABLE course (
CourseID INT PRIMARY KEY,
CourseName VARCHAR(100) NOT NULL,
Credits FLOAT(5,2) NOT NULL
);
选课表(Enrollment)
- EnrollmentID(主键):选课记录的唯一标识,可以自动生成。
- StudentID(外键):引用学生表中的StudentID,表示选修该课程的学生。
- CourseID(外键):引用课程表中的CourseID,表示被选修的课程。
- Grade:学生选修该课程的成绩。允许为空(可能学生还未参加考试或成绩未被录入)。
实例说明
主键:
CREATE TABLE enrollment (
EnrollmentID INT AUTO_INCREMENT PRIMARY KEY,
StudentID INT NOT NULL,
CourseID INT NOT NULL,
Grade FLOAT(5,2), -- 假设成绩字段Grade保留5位数字,其中小数点后有2位
CONSTRAINT fk_student FOREIGN KEY (StudentID) REFERENCES student(StudentID),
CONSTRAINT fk_course FOREIGN KEY (CourseID) REFERENCES course(CourseID)
);
在学生表(Student)中,StudentID是主键,它唯一地标识了每一个学生。
在课程表(Course)中,CourseID是主键,它唯一地标识了每一门课程。
在选课表(Enrollment)中,EnrollmentID是主键,它唯一地标识了每一条选课记录。
外键:
在选课表(Enrollment)中,StudentID是外键,
它引用了学生表(Student)中的StudentID。
这表示每一条选课记录都关联到一个具体的学生。
同样地,在选课表(Enrollment)中,CourseID也是外键,
它引用了课程表(Course)中的CourseID。
这表示每一条选课记录都关联到一个具体的课程。
数据完整性
通过主键和外键的设置,我们可以确保数据的完整性:
每个学生和每门课程在各自的表中都是唯一的(由主键保证)。
每条选课记录都关联到一个具体的学生和一门具体的课程(由外键保证)。
如果尝试在选课表(Enrollment)中插入一个不存在于学生表(Student)中的StudentID,或者一个不存在于课程表(Course)中的CourseID,数据库将拒绝这种插入操作,从而维护了数据的完整性。
1
外键的创建和使用场景
在数据库设计中,外键通常用于关联具有相关性的数据表。
例如,在“订单”表中,“客户ID”作为外键引用“客户”表中的主键“ID”,确保每个订单都对应一个有效的客户
外键是某个表中的一列,它包含在另一个表的主键中。外键用于建立表之间的关系,确保数据的完整性和一致性。外键的主要作用包括:
保证数据的一致性:通过引用另一表的主键,外键确保了表之间的数据关联是正确的,防止无效数据的插入和修改
减少数据冗余:通过引用其他表的主键,可以避免在多个表中重复存储相同的数据
实现级联操作:在外键约束下,可以对主表和从表进行级联操作,如主表删除行时,从表中相关行也会被删除,保持数据的一致性
外键的定义和作用
外键是用于建立表之间关系的一个或多个字段,这些字段引用另一表的主键。外键确保了数据的引用完整性,即被引用的字段必须是主键或唯一键。外键的作用包括:
防止无效数据插入:如果从表中的外键值不在主表中存在,则无法插入新行
修改和删除限制:从表的修改和删除操作也会受到主表的影响,确保数据的一致性
外键的约束类型
外键约束类型包括:
ON DELETE CASCADE:删除主表中的行时,从表中的相关行也会被删除。
ON DELETE SET NULL:删除主表中的行时,从表中的相关行对应的外键字段会被设置为NULL。
ON UPDATE CASCADE:更新主表中的主键时,从表中的相关行的外键也会被更新。
ON UPDATE SET NULL:更新主表中的主键时,从表中的相关行的外键会被设置为NULL
2
外键
含义:外键用于与另一张表的关联,是能确定另一张表记录的字段,用于保持数据的一致性
举例说明
员工表emp(员工号,姓名,性别,薪水,部门号) (主键员工号,外键部门号)
部门表department(部门号,部门地址,部门电话) (主键部门号)
添加外键约束
alter table 表名 add constraint FK_ID foreign key(你的外键字段名) REFERENCES 外表表名(对应的表的主键字段名);