补12.关于mysql的外键约束
admin
2023-05-18 12:01:54
0

一、什么是mysql中的外键(froeign key)

假如说有两张表,其中一张表的某个字段指向了另一张表的主键,这就可以称之为外键(froeign key)。

在子表中增加一条记录时,需要确定是否有与父表相对应的记录。

如果父表没有对应的记录,那么子表(从表)无法插入这条数据。


下面是一个关于外键的示例:

1.首先创建一个主表,这个主表存放了班级信息。

create table class ( id TINYINT PRIMARY KEY auto_increment, class_name varchar(20)) engine=innodb;

2.在class表中插入五条记录,代表有5个班级。

insert into class (id,class_name)value(1,"class1"), (2,"class2"), (3,"class3"), (4,"class4"), (5,"class5");

3.创建一个子表,这个子表存放了学生和班级的对应关系,这些学生属于哪个班级?

create table student( id int primary key auto_increment, name varchar(20), class_id TINYINT) engine=innodb;

4.插入6条记录,代表了6个学生。

insert into student(id,name,class_id) value (1,"stu1",2),(2,"stu2",2),(3,"stu3",1),(4,"stu4",3),(5,"stu5",1),(6,"stu6",4);


现在的规则是,一个班级可以对应多个学生,但是一个学生只能属于一个班级。


5.增加外键约束。

接下来,为student表增加一个外键约束。

alter table student add constraint cls_stu foreign key(class_id) references class(id);

#约束字段以class表的id字段为主。


6.测试外键约束是否生效。

刚刚我们创建的class班级表中一共有5个记录,也就是五个班级。(分别是class1~class5)

现在学生表中,新增一个学生,这个学生属于一个class表中不存在的班级,班级6,看看会是什么效果:

mysql> insert into student(id,name,class_id)value(7,"stu7",6);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`db_1`.`student`, CONSTRAINT `cls_stu` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`))

无法添加这个记录,这说明了,student表的class_id字段,已经受class表的id字段的约束,当class表的id字段没有这个id时,student表无法插入这条记录。



7.删除一个表的外键约束。

ALTER TABLE student DROP FOREIGN KEY 【外键名称】

例:

alter table student drop foreign key cls_stu;


8.innodb引擎支持的一些关于外键的操作。

#当一个表被设置了外键约束,如果在父表中找不到候选键,则不允许在子表上进行insert/update操作。

# 注意!!!在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update或on delete子句!!!

#下面是innodb引擎所支持的常见的四种方式:


8.1cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录

外键的级联删除:如果父表中的记录被删除,则子表中对应的记录自动被删除

alter table student add constraint cls_stu foreign key(class_id) references class(id) on delete cascade;

#级联删除或更改,当父表外键位置做出修改,或者删除,子表更改或删除完全取决于 on delete或者on update,当然,这两个关键字是可以同时出现的!!!

下面是一个级联删除关键字的示例:

alter table student add constraint cls_stu foreign key(class_id) references class(id) on delete cascade;


8.2 set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null。

例:

alter table student add constraint cls_stu foreign key(class_id) references class(id) on delete set null;


8.3 Restrict方式 :拒绝对父表进行删除更新操作(不常用)。


8.4 No action方式 在mysql中同Restrict,如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作(了解)


9.关于外键的一些补充:

设置级联操作:

在主表数据发生改变时,与之关联的从表数据应该如何处理

    使用关键字:

     on update

     on delete

    来标识

允许的级联动作:

cascade关联操作,如果主表被更新或删除,从表也会执行相应的操作

set null,表示从表数据不指向主表任何记录

restrict:拒绝主表的相关操作

alter table t_student add foreign key (class_id) references t_class (class_id)

on delete set null; # 在删除外键时,将从表的外键值设置为null

修改外键:

先删除这个表的外键,然后再增加

alter table tb_name drop froeign key 外键名称

外键名称在建立外键时可以自定义名称,如果不自定义,会按照mysql自动生成一个名称

show create table tb_name;


相关内容

热门资讯

揭沈伯洋最大问题,李明璇:选区... 海峡导报综合报道 民进党民代沈伯洋13日正式获民进党征召参选台北市长,国民党台北市松山、信义区议员参...
关爱特殊群体 ↑ 5月16日,石家庄市新华区天苑社区的志愿者陪伴残疾人进行户外活动。新华社发(闫志国摄)全国助残日...
MCN离职员工称盲人主播赛道已... 5月16日,“首都网警”公众号通报了北京警方近期查处的三起网络摆拍、造假案件。其中:刘某(男,26岁...
琼水表业取得水暖管件拼接装置专... 国家知识产权局信息显示,海南琼水表业有限公司取得一项名为“一种水暖管件拼接装置”的专利,授权公告号C...
一台机器人意外摔倒获赔5976... 全国首例具身智能机器人保险理赔近日在上海落地。一台机器人意外倾覆,造成摄像头及配件损坏,最终获得保险...
日本17日起在冲绳县实施“陆上... 据日本方面17日消息,日本陆上自卫队将于17日至22日,首次在冲绳县的宫古岛、石垣岛和与那国岛3地,...
性侵迷局:双方在车内有亲密行为... 从2025年1月27日因涉嫌犯强奸罪被刑拘至同年12月25日被取保候审,在长达11个月的时间里,王明...
美国对俄罗斯石油的豁免到期,此... 【文/观察者网 齐倩】美国政府针对部分俄罗斯石油和石油产品的进口豁免,即将于当地时间5月17日到期。...
原创 全... 5月16日,中国光通信传来史诗级突破!国家信息光电子创新中心正式官宣:依托自主研发超宽带光子芯片技术...
网传“三大运营商将免月租”,官... 坊友们的手机套餐是谁家的? 最近有没有刷到这条消息 称“三大运营商即将全面推出 免月租、按量计费套餐...