外键约束!

本文通过描述班级和学生的数据库设计案例,探讨了外键约束的重要性和使用。首先介绍了外键约束的概念,然后提出了两种设计方案,分析了数据冗余的问题,并选择了班级和学生分开存储的方案。接着展示了如何在SQL中创建带外键约束的表,强调了外键不一定要引用主键,但需有唯一性约束。最后讨论了外键是否可以为NULL的情况,并进行了测试。
摘要由CSDN通过智能技术生成

目录

外键约束(foreign key,简称FK)非常重要五颗星*****

1. 外键约束涉及到的相关术语:

2. 业务背景

请设计数据库表,来描述“班级和学生”的信息?

3. 演示上述2.2第二种方案来设计数据库表

t_student.sql 文件中的sql语句

4. 思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

5. 测试:外键可以为NULL吗?


外键约束(foreign key,简称FK)非常重要五颗星*****

1. 外键约束涉及到的相关术语:

  • 外键约束:一种约束(foreign key)
  • 外键字段:该字段上添加了外键约束
  • 外键值:外键字段当中的每一个值。

2. 业务背景

请设计数据库表,来描述“班级和学生”的信息?

2.1 第一种方案:班级和学生存储在一张表中

t_student

分析以上方案的缺点:

  • 数据冗余,空间浪费!!!!
  •  这个设计是比较失败的!

2.2 第二种方案:班级一张表、学生一张表

t_class 班级表

t_student 学生表 

当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。那么:cno字段就是外键字段,cno字段中的每一个值都是外键值。

注意:

  • t_class是父表
  • t_student是子表

删除表的顺序?

  • 先删子,再删父。

删除数据的顺序?

  • 先删子,再删父。

创建表的顺序?

  • 先创建父,再创建子。

插入数据的顺序?

  • 先插入父,再插入子。

3. 演示上述2.2第二种方案来设计数据库表

references:引用

t_student.sql 文件中的sql语句

drop table if exists t_student;
drop table if exists t_class;

create table t_class(
    classno int primary key,
    classname varchar(255)
);
create table t_student(
    no int primary key auto_increment,
    name varchar(255),
    cno int,
    foreign key(cno) references t_class(classno)
);

insert into t_class(classno, classname) values(100, '北京市大兴区亦庄镇第二中学高三1班');
insert into t_class(classno, classname) values(101, '北京市大兴区亦庄镇第二中学高三1班');

insert into t_student(name,cno) values('jack', 100);
insert into t_student(name,cno) values('lucy', 100);
insert into t_student(name,cno) values('lilei', 100);
insert into t_student(name,cno) values('hanmeimei', 100);
insert into t_student(name,cno) values('zhangsan', 101);
insert into t_student(name,cno) values('lisi', 101);
insert into t_student(name,cno) values('wangwu', 101);
insert into t_student(name,cno) values('zhaoliu', 101);

select * from t_student;
select * from t_class;

 

4. 思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少要有unique约束

5. 测试:外键可以为NULL吗?

外键值可以为NULL

insert into t_student(name) values('wangwuliu');

select * from t_student;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值