服务器之家:专注于服务器技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|

服务器之家 - 数据库 - Mysql - mysql外键基本功能与用法详解

mysql外键基本功能与用法详解

2021-01-13 18:59随风行云 Mysql

这篇文章主要介绍了mysql外键基本功能与用法,结合实例形式详细分析了mysql外键的基本概念、功能、用法及操作注意事项,需要的朋友可以参考下

本文实例讲述了mysql外键基本功能与用法。分享给大家供大家参考,具体如下:

本文内容:

  • 什么是外键
  • 外键的增加
  • 外键的修改和删除
  • 外键的约束模式

首发日期:2018-04-12


什么是外键:

  • 外键就是表中存在一个字段指向另外一个表的主键,那么这个字段就可以称为外键。
  • 一张表可以有多个外键。
  • 外键用于约束表与表之间的关系,可以说外键是表之间的映射关系,这个关系可以帮助我们处理表之间关系的紧密性和存在性(比如学生表的cid班级号与班级表的id建立关联,cid应该不能为不存在的,如果不增加外键cid,没有建立上关系,我们就不知道班级号不存在。)。
  • 或者说,外键是告诉数据库系统,我们所认为的关系,单纯的数据,系统是不知道实际意义的,外键就是告诉系统应该如何处理他们的关系。
  • 所以,外键的核心是约束。

外键的增加:

  • 创建外键的前提是该字段首先是一个索引,如果不是的话,创建外键是会创建成一个普通索引【所以可以不在意】。
  • 创建外键的另外一个前提是“指向表”已经创建,对于一个不存在的表,将无法使用外键对应上。
  • 增加的方式:
    • 1.在创建表的时候定义,在所有字段定义结束后使用foreign key(外键字段) references 指向表(主键)来 定义,比如mysql外键基本功能与用法详解
    • 2.也可以修改字段来增加: alter table 表名 add [constraint 外键名字] foreign key(外键字段) references 父表(主键字段);
      • constraint 外键名字:可以帮助定义外键的名字,但不建议使用,因为要求外键名都唯一,而使用系统自定义的绝对不会重复,
?
1
2
3
4
5
6
7
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)
);
?
1
2
3
4
create table class(
id int primary key auto_increment,
cname varchar(15)
);

补充:

  • 在mysql中,如果存储引擎不是innodb,那么无法使外键的约束作用生效,即使是能成功增加外键。
  • 外键名不能重复,所以不建议使用constraint 外键名字

外键的修改与删除:

  • 修改:不能修改外键信息,如外键指向之类的,只能先删除再新增。
  • 删除语法:alter table 表名 drop foreign key 外键名;
    • 这里的外键名不是外键字段,而是外键名。如果没有使用constraint来定义,可以通过show create来查看表创建语句中系统定义的外键名。
    • mysql外键基本功能与用法详解

补充:

  • 删除外键时,如果使用desc会看到表结构还有mul,那是一个索引。因为创建外键时,字段会被创建成一个索引。如果不想保留,可以使用drop index 字段名 on 表名.

外键的约束模式:

  • 外键是用来约束表之间的关系的。
  • (约定创建外键的表称为子表,指向的表称为父表)
    • 针对子表:可以约束子表的插入和修改【这种约束是父表对子表的约束】
      • 涉及到外键的插入和修改时,如果外键字段找不到对应的匹配那么会插入\修改失败(像插入选课记录不可能插入一门课程表中没有的课程)。
      • 比如:mysql外键基本功能与用法详解
    • 针对父表:可以约束父表的删除和更新,通常有可以以下几种约束模式。【这种约束是子表对父表的约束】
      • 模式:
        • strict严格模式:涉及到外键的删除和更新时,如果对应记录的主键数据已经被子表使用时,那么无法删除(像已经有人入学了某个班级,学校不可能犯傻去把某个班级删除,只能删除那些没人入学的班级。)
        • cascade级联模式:涉及到外键的删除和更新时,如果字段已经被子表使用,子表中的数据会对应更新(像某个班改了班号,那么学生表中的班别都对应更改;如果某个班被删除,就删除对应班的所有学生)
        • set null置空模式:涉及到外键的删除和更新时,如果字段已经被子表使用,那么子表中的外键数据会置空(像某个班被删掉了,不应该删掉所有学生,而是应该给他们先置空再重新分配班别)【子表允许置空的前提是该字段允许为空】
      • 其实可以给不同操作指定不同模式
      • 综上所述(根据我的那些举例),实际上,合适的举措是删除时置空(即使某个班太垃圾了,想删除某个班,但也不应该将所有学生退学,而是将它们分到别的班),修改时级联(允许更改班号,而且更改会更新到学生中)
      • 不同操作设置不同模式的设置方法(在子表中操作):foreign key(外键字段) references 父表(主键) on 操作 模式
        ?
        1
        foreign key(外键字段) references 父表 (主键) on delete set null on update cascade;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- 实验表结构
create table class(
id int primary key auto_increment,
cname varchar(15)
);
create table student2(
id int primary key auto_increment,
name varchar(15) not null,
gender varchar(10) not null,
cid int,
foreign key(cid) references class(id) on delete set null on update cascade
);
-- 实验表数据:
insert into class(cname) values("python"),("linux"),("java"),("html5");
 
insert into student2(name,gender,cid) values("alice","female",1);
insert into student2(name,gender,cid) values("john","female",2);
insert into student2(name,gender,cid) values("jack","female",3);
insert into student2(name,gender,cid) values("amy","female",4);
 
select * from student2;
select * from class;
-- 尝试更新级联
update class set id = 6 where cname="python";
select * from student2; -- 结果原来的python的cid=6
-- 尝试删除置空
delete from class where cname="java";
select * from student2; -- 结果原来的java的cid=null

补充:

  • 需要设置好约束模式,不要在多个子表中使用不同的约束模式,不然会冲突。

希望本文所述对大家MySQL数据库计有所帮助。

原文链接:https://www.cnblogs.com/progor/p/8799922.html

延伸 · 阅读

精彩推荐
  • MysqlMySql 知识点之事务、索引、锁原理与用法解析

    MySql 知识点之事务、索引、锁原理与用法解析

    这篇文章主要介绍了MySql 知识点之事务、索引、锁原理与用法,结合实例形式较为详细的分析了mysql数据库事务、索引、锁的概念、原理、使用方法及相关操...

    LoongDD1762020-12-07
  • Mysql如何将Excel文件导入MySQL数据库

    如何将Excel文件导入MySQL数据库

    这篇文章主要为大家详细介绍了Excel文件导入MySQL数据库的具体方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    罗思洋1522020-11-27
  • Mysql详解关于MySQL 8.0走过的坑

    详解关于MySQL 8.0走过的坑

    这篇文章主要介绍了详解关于MySQL 8.0走过的坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    石博孚4262019-06-22
  • Mysqlmysql中left join设置条件在on与where时的用法区别分析

    mysql中left join设置条件在on与where时的用法区别分析

    这篇文章主要介绍了mysql中left join设置条件在on与where时的用法区别,结合实例形式分析了mysql中left join设置条件在on与where时的相关用法区别与操作注意事项...

    怀素真4452021-01-07
  • MysqlMySQL数据库设置远程访问权限方法小结

    MySQL数据库设置远程访问权限方法小结

    很多情况下我们需要远程连接mysql数据库,那么就可以参考下面的权限设置 ...

    MYSQL教程网3082020-01-12
  • MysqlMysql GTID Mha配置方法

    Mysql GTID Mha配置方法

    下面小编就为大家带来一篇Mysql GTID Mha配置方法。小编觉的挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    jingxian4062020-07-21
  • MysqlLinux利用UDF库实现Mysql提权

    Linux利用UDF库实现Mysql提权

    根据MySQL函数族的可扩展机制,意味着用户可以自己建立包含有自定义函数的动态库来创建自定义函数,简称udf ...

    hebedich4212020-04-08
  • MysqlMybatis mapper动态代理的原理解析

    Mybatis mapper动态代理的原理解析

    这篇文章主要介绍了Mybatis mapper动态代理的原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    全me村的希望3422020-11-30