31 外键约束
* 关于外键约束的相关术语:
外键约束:foreign key
外键字段:添加有外键约束的字段。
外键值 :外键字段中的每一个值。
* 业务背景:
请设计数据库表,用来维护学生和班级的信息?
第一种方案:一张表存储所有数据
t_calss 班级表
no(pk) name classno classname
--------------------------------------
1 zs1 101 呵呵
2 zs2 101 呵呵
3 zs3 102 呵呵
4 zs4 102 呵呵
5 zs5 102 呵呵
缺点:冗余【不推荐】
第二种方案:两张表(班级表和学生表)
t_class(pk) cname
-----------------
101 呵呵
102 哈哈
t_student 学生表
sno(pk) sname cno(该字段添加外键约束fk)
-------------------------------
1 zs1 101
2 zs2 101
3 zs3 101
4 zs4 102
5 zs5 102
* 将以上表的建表语句写出来:
t_student当中的cno字段引用t_class表中的no字段,此时t_student表叫做子表。t_class表叫做父表。
顺序要求:
删除数据的时候,先删除子表,再删除父表。
添加数据的时候,先添加父表,再添加子表。
创建表的时候,先创建父表,在创建子表。
删除表的时候,先删除子表,再删除父表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
primary key(sno),
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
insert into t_class values(102,'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb');
insert into t_student values(1,'zs1',101);
insert into t_student values(2,'zs2',101);
insert into t_student values(3,'zs3',101);
insert into t_student values(4,'zs4',102);
insert into t_student values(5,'zs5',102);
insert into t_student values(6,'zs6',102);
select * from t_class;
select * from t_student;
//ERROR 1452 (23000): Cannot add or update a child row: a foreign key
//constraint fails (`mydatabase`.`t_student`, CONSTRAINT `t_student_ibfk_1` FOREIGN KEY (`classno`) REFERENCES `t_class` (`cno`))
insert into t_student values(7,'zs7',103);
* 外键值可以为null?
外键可以为null。
* 外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
注意:被引用的字段不一定是主键,但至少具有unique约束。