04|Oracle学习(外键约束)

备注:下文中出现的 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;

猜你喜欢

转载自blog.csdn.net/qq_41714549/article/details/132056405