版权声明:本文为徐代龙原创文章,未经徐代龙允许不得转载。网络资源网站:xudailong.cc 福利网站:www.00reso.com 公众号:蛇崽网盘教程资源 https://blog.csdn.net/xudailong_blog/article/details/84238256
场景
设计数据库表,用来存储学生和班级信息表
第一种情况:
将学生信息和班级信息存储到一张表中
sno sname classno cname
1 周杰伦 001 高三1班
2 林俊杰 002 高三1班
3 詹姆斯 003 高三2班
这种情况会造成数据冗余问题,比如cname
字段的数据重复太多,这时候稍微有经验点的就会讲学生信息和班级信息分开成两张表进行存储。
第二种情况:
学生表(添加单一外键)
sno(pk) sname classno(fk)
1 周杰伦 001
2 林俊杰 002
3 詹姆斯 003
班级表
cno(pk) cname
100 高三1班
200 高三2班
为了保证学生表中的classno字段中的数据必须来自于班级表中的cno字段中的数据,有必要给学生表中的classno字段添加外键约束
mysql> drop table if exists t_student;
mysql> drop table if exists t_class;
mysql> create table t_class(
-> cno int(10) primary key,
-> cname varchar(128) not null unique
-> );
mysql> create table t_student(
-> sno int(10) primary key auto_increment,
-> sname varchar(32) not null,
-> classno int(3),
-> foreign key(classno) references t_class(cno)
-> );
外键CONSTRAINT的注意点:
- 外键值可以为NULL
- 外键字段去引用一张表的某个字段的时候,被引用的字段必须有unique约束
- 使用外键后,两张表分为父子表:班级表(父表),学生表(子表)
- 创建先创建父表
- 删除先删除子表数据
- 插入先插入父表数据
例子:
# 父表中的deptId,为被引用的字段
CREATE TABLE employ(id INT PRIMARY KEY,ename VARCHAR(20),deptId INT);
# 子表使用CONSTRAINT 进行对父表deptId的引用
CREATE TABLE employ(id INT PRIMARY KEY,ename VARCHAR(20),deptId INT,
CONSTRAINT employ_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id));
CREATE TABLE employ(id INT PRIMARY KEY,ename VARCHAR(20),deptId INT, CONSTRAINT employ_dept_fk FOREIGN KEY(deptId) REFERENCES dept(id));
个人网站:http://xudailong.cc
关注「蛇崽网盘教程资源」公众号 ,在微信后台回复「领取资源」,获取IT资源200G干货大全。
更多资源请访问:
https://blog.csdn.net/xudailong_blog/article/details/78762262
某课视频教程
https://xudailong.cc/2018/09/30/muke-courses/
关注「蛇崽网盘教程资源」公众号 ,在微信后台回复「领取资源」,获取IT资源200G干货大全。
在微信后台回复「130个小程序」,即可免费领取享有导入就能跑的微信小程序