MySQL外键

数据库表的外键约束

外键约束要有两张表
其中一张是主键表,另外一张是外键表
关系就是一对多, 主键是不允许重复(主键表)
                          外键是可以重复的 ( 外键表)

班级表(主键表)和学生表(外键表)
(1)先创建主键表,再创建外键表
(2)为外键表添加外键约束
(3)先为主键表添加测试数据,再为外键表添加测试数据
--如果要是删除,则需要先删除外键表的数据,再删除主键表的数据

 -- 创建主键表
create table clazz(
 clazzid int(4) primary key  auto_increment,
 clazzname varchar(10) not null,
 room varchar(10)
);
-- 创建外键表
create table student(
 stuno int(4) primary key auto_increment,
 stuname varchar(20) not null,
 gender varchar(2) default'男',
 clazzid int(4)
);
-- 为学生表添加外键约束
alter table student add constraint fk_clazzid foreign key (clazzid)
REFERENCES clazz (clazzid);
-- 添加测试数据
insert into clazz (clazzname,room) values ('零基础java班','403');
insert into clazz (clazzname,room) values ('高薪大数据就业班','506');
insert into clazz (clazzname,room) values ('美女最多前端班','508');
-- 向学生表添加测试数据
insert into student (stuname,clazzid) values ('zhangsan',4); -- 报错clazz只能在1,2,3中选择
insert into student (stuname,clazzid) values ('zhangsan',2);
select * from clazz
select * from student
delete from clazz where clazzid=2; -- 无法删除成功,因为2号班级有学生
/** 外键的三种策略
 (1) 不允许   ,要想删除班级,必须手动删除该班级下的学生
     alter table student add constraint fk_clazzid foreign key (clazzid)
   REFERENCES clazz (clazzid);
 (2)级联cascade ,在删除班级的同时,将学生也删除
 (3)set null ,将班级删除,班级所对应的学生的的班级设置为null
*/
-- 删除外键
alter table student drop foreign key fk_clazzid ;
-- 测试外键是否被删除
insert into student (stuname,clazzid) values ('zhangsan',4); 
delete from student where stuno=7;
-- 重新添加外键
 alter table student add constraint fk_clazzid foreign key (clazzid)
   REFERENCES clazz (clazzid) on delete set null; -- 删除主键表中的数据时,外键表中对应的数据设置为null
delete from clazz where clazzid=2; 
update student set clazzid=1 where stuno=6;
-- 重新添加外键约束
alter table student add constraint fk_clazzid foreign key (clazzid)
   REFERENCES clazz (clazzid) on delete set null on update cascade ;
select * from clazz;
select *from student;
delete from clazz where clazzid=3;

添加外键时要求先查看两个表中的数据,是否一致,否则添加不成功

级联  :删除主键时,外键所对应的数据也都跟着一起删除
alter table student add constraint fk_clazzid foreign key (clazzid)
   REFERENCES clazz (clazzid) ON delete CASCADE ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值