备注:下文中出现的 add constraints应改为add constraint,不需要加s
1.外键约束介绍
1.1 什么是外键约束:
如果按下面的设计,直接在原表中添加“班级编号”、“班级名称”、“班主任”、“班级描述”这些列名,会出现什么问题?
- 可以看到上面黄色画出来的部分内容是相同的(也就是内容被重复存储)。如果数据量过亿,那么这种重复的数据被多次存储也叫做“数据冗余”。
- 而上面的“数据冗余”会带来严重的问题:如果C01班的班主任王老师换成了李老师,那么过亿的数据中我们要把所有的C01班王老师换成李老师,这个工程量是非常大的,也容易出现操作失误。
常用的操作:把“班级编号”、“班级名称”、“班主任”、“班级描述”拿出来,单独做成一张班级信息表
然后,在学生表中绑定一个“班级编号”即可,就让两张表之间形成了关联。
1.2小结:
- 外键约束:限定外键字段的值必须来自于其他数据表中的关联字段。
2.添加外键约束
2.1 创建表时添加
- 级联删除:如下表示,当主键C01删除时,运用C01的张三、王五也会被删除。
2.1.1 案例
- 创建班级信息表:班级编号、班级名称、班主任、班级描述
create table tb_classes(
class_id char(3) not null,
class_name varchar(40) not null,
class_leader varchar(10) not null,
class_desc varchar(200),
primary key(class_id)
);
- 创建学生信息表:学号、姓名、性别、年龄、电话、编号
create table tb_students(
stu_num char(5) not null,
stu_name varchar(10) not null,
stu_sex char(1) not null,
stu_age number(2) not null,
stu_tel char(11) not null,
stu_cid char(3) not null,
primary key(stu_num),
constraint fk_students_class foreign key(stu_cid)
references tb_classes(class_id) on delete cascade
);
- 可以看到最终的效果:
2.2 创表后,再添加
注意:如果先前创建了相互依赖的tb_classes和tb_students表。那么要先删除外键的tb_students,再删除主键的tb_classes。(先删从,后删主)
drop table tb_students;
drop table tb_classes;
2.2.1 案例
- 创建班级信息表:班级编号、班级名称、班主任、班级描述
create table tb_classes(
class_id char(3) not null,
class_name varchar(40) not null,
class_leader varchar(10) not null,
class_desc varchar(200),
primary key(class_id)
);
- 创建学生表(这次不在创建时建立好外键约束):学号、姓名、性别、年龄、电话、编号
create table tb_students(
stu_num char(5) not null,
stu_name varchar(10) not null,
stu_sex char(1) not null,
stu_age number(2) not null,
stu_tel char(11) not null,
stu_cid char(3) not null,
primary key(stu_num)
);
- 接下来,对学生信息表tb_students进行alter,添加外键:
alter table tb_students
add constraint fk_student_class foreign key(stu_cid)
references tb_classes(class_id) on delete cascade;
3.删除外键约束
- 删除上面的tb_student中的约束:
alter table tb_students
drop constraint fk_student_class;