加入收藏 | 设为首页 | 会员中心 | 我要投稿 黄山站长网 (https://www.0559zz.com.cn/)- 迁移、建站、智能边缘、云容器引擎、数据快递!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL教程之mysql之外键

发布时间:2022-08-10 10:13:01 所属栏目:MySql教程 来源:互联网
导读:本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: 外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。 一张表可以有多个外键。 外键用于约束表与表之间的关系,可以说外键是
  本文内容:
   
 
  什么是外键
  外键的增加
  外键的修改和删除
  外键的约束模式
   
 
  首发日期:2018-04-12
 
  什么是外键:
   
 
  外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。
  一张表可以有多个外键。
  外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性(比如学生表的cid班级号与班级表的id建立关联,cid应该不能为不存在的,如果不增加外键cid,没有建立上关系,我们就不知道班级号不存在。)。
  或者说,外键是告诉数据库系统,我们所认为的关系,单纯的数据,系统是不知道实际意义的,外键就是告诉系统应该如何处理他们的关系。
  所以,外键的核心是约束。
   
 
   
 
  外键的增加:
   
 
  创建外键的前提是该字段首先是一个索引,如果不是的话,创建外键是会创建成一个普通索引【所以可以不在意】。
  创建外键的另外一个前提是“指向表”已经创建,对于一个不存在的表,将无法使用外键对应上。
  增加的方式:
  1.在创建表的时候定义,在所有字段定义结束后使用foreign key(外键字段) references 指向表(主键)来 定义,比如image
  2.也可以修改字段来增加: alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
  constraint 外键名字:可以帮助定义外键的名字,但不建议使用,因为要求外键名都唯一,而使用系统自定义的绝对不会重复,
   
 
  复制代码
  create table student(
  id int primary key auto_increment,
  name varchar(15) not null,
  gender varchar(10) not null,
  cid int,
  foreign key(cid) references class(id)
  );
  create table class(
  id int primary key auto_increment,
  cname varchar(15)
  );
  复制代码
   
 
   
 
  补充:
  在Mysql中,如果存储引擎不是innodb,那么无法使外键的约束作用生效,即使是能成功增加外键。
  外键名不能重复,所以不建议使用constraint 外键名字
   
 
   
 
  外键的修改与删除:
   
 
  修改:不能修改外键信息,如外键指向之类的,只能先删除再新增。
  删除语法:alter table 表名 drop foreign key 外键名;
  这里的外键名不是外键字段,而是外键名。如果没有使用constraint来定义,可以通过show create来查看表创建语句中系统定义的外键名。
  image
   
 
   
 
   
 
  补充:
  删除外键时,如果使用desc会看到表结构还有MUL,那是一个索引。因为创建外键时,字段会被创建成一个索引。如果不想保留,可以使用drop index 字段名 on 表名.
   
 
   
 
   
 
  外键的约束模式:
   
 
  外键是用来约束表之间的关系的。
  (约定创建外键的表称为子表,指向的表称为父表)
  针对子表:可以约束子表的插入和修改【这种约束是父表对子表的约束】
  涉及到外键的插入和修改时,如果外键字段找不到对应的匹配那么会插入修改失败(像插入选课记录不可能插入一门课程表中没有的课程)。
  比如:image
  针对父表:可以约束父表的删除和更新,通常有可以以下几种约束模式。【这种约束是子表对父表的约束】
  模式:
  strict严格模式:涉及到外键的删除和更新时,如果对应记录的主键数据已经被子表使用时,那么无法删除(像已经有人入学了某个班级,学校不可能犯傻去把某个班级删除,只能删除那些没人入学的班级。)
  cascade级联模式:涉及到外键的删除和更新时,如果字段已经被子表使用,子表中的数据会对应更新(像某个班改了班号,那么学生表中的班别都对应更改;如果某个班被删除,就删除对应班的所有学生)
  set null置空模式:涉及到外键的删除和更新时,如果字段已经被子表使用,那么子表中的外键数据会置空(像某个班被删掉了,不应该删掉所有学生,而是应该给他们先置空再重新分配班别)【子表允许置空的前提是该字段允许为空】
  其实可以给不同操作指定不同模式
  综上所述(根据我的那些举例),实际上,合适的举措是删除时置空(即使某个班太垃圾了,想删除某个班,但也不应该将所有学生退学,而是将它们分到别的班),修改时级联(允许更改班号,而且更改会更新到学生中)
  不同操作设置不同模式的设置方法(在子表中操作):foreign key(外键字段) references 父表(主键) on 操作 模式
  foreign key(外键字段) references 父表 (主键) on delete set null on update cascade;

(编辑:黄山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读