返回顶部
首页 > 资讯 > 数据库 >mysql外键基本功能与用法详解
  • 569
分享到

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

mysql外键 2022-05-21 10:05:27 569人浏览 泡泡鱼
摘要

本文实例讲述了Mysql外键基本功能与用法。分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键:

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

本文内容:

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

首发日期: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;

-- 实验表结构
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相关内容感兴趣的读者可查看本站专题:《MySQL查询技巧大全》、《MySQL常用函数大汇总》、《MySQL日志操作技巧大全》、《MySQL事务操作技巧汇总》、《MySQL存储过程技巧大全》及《MySQL数据库相关技巧汇总》

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

您可能感兴趣的文档:

--结束END--

本文标题: mysql外键基本功能与用法详解

本文链接: https://lsjlt.com/news/9553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • mysql外键基本功能与用法详解
    本文实例讲述了mysql外键基本功能与用法。分享给大家供大家参考,具体如下: 本文内容: 什么是外键 外键的增加 外键的修改和删除 外键的约束模式 首发日期:2018-04-12 什么是外键: ...
    99+
    2022-05-21
    mysql 外键
  • MySQL 外键(FOREIGN KEY)用法案例详解
    引子:把所有数据都存放于一张表的弊端 表的组织结构复杂不清晰 浪费空间 扩展性极差 为了解决上述的问题,就需要用多张表来存放数据。 表与表的记录之间存在着三种关系:一对多、多对多、一对一的...
    99+
    2022-05-18
    MySQL 外键 MySQL FOREIGN KEY
  • MySQL常用存储引擎功能与用法详解
    本文实例讲述了MySQL常用存储引擎功能与用法。分享给大家供大家参考,具体如下: MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB、BDB。 2. 非事务安全表:MyISAM、MEMORY、...
    99+
    2024-04-02
  • 详解Python网络爬虫功能的基本写法
    网络爬虫,即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。 1. 网络爬虫的定义 网络蜘蛛是通过网页的链接地址来寻找网页的。从网站某一个页面(...
    99+
    2022-06-04
    爬虫 写法 详解
  • Python OpenCV超详细讲解基本功能
    目录准备工作转成灰度图像高斯模糊边缘检测膨胀运算腐蚀运算准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库。 ...
    99+
    2024-04-02
  • MySQL数据库中外键的作用及用法详解
    MySQL数据库中外键的作用及用法详解 在MySQL数据库中,外键是用来建立表与表之间关联的重要工具,它能够确保数据完整性,并且提供了一种方式来维护表与表之间的关系。本文将详细介绍My...
    99+
    2024-03-15
    外键 - 关联 用法 - 详解
  • JavaScriptProxy基本用法详解
    目录1.语法2.基本用法3.可消除的Proxy4.Vue为什么要用Proxy重构5.Proxy与defineProperty的对比1.语法 const proxy = new Pro...
    99+
    2022-12-30
    JavaScript Proxy语法 JS Proxy
  • Sharding-Proxy基本功能用法介绍
    目录Sharding-Proxy的安装server.yaml配置config-sharding.yaml的配置config-master_slave.yaml的配置config-sh...
    99+
    2024-04-02
  • 详解Jackson的基本用法
    目录一、前言二、Jackson的核心模块三、ObjectMapper的使用四、信息配置五、Jackson注解的使用六、Jackson示例6.1、Jackson ObjectMappe...
    99+
    2024-04-02
  • Android SQLite基本用法详解
    目录一.SQLite的介绍1.SQLite简介2.SQLite的特点:3.SQLite数据类型二.SQLiteDatabase的介绍1、打开或者创建数据库2、创建表3、插入数据4、删...
    99+
    2024-04-02
  • JavaScriptreduce的基本用法详解
    目录reduce的基本定义基本用法计算数组里面所有值的和!累加对象数组里的值!将二维数组转换为一维数组!计算数组中每个元素出现的次数用Reduce按属性对object分类使用扩展运算...
    99+
    2024-04-02
  • Thread 类基本用法详解
    Thread 类基本用法详解 Thread类的作用线程创建继承 Thread, 重写 run实现 Runnable, 重写 run继承 Thread, 重写 run, 使用匿名内部类实现 Ru...
    99+
    2023-10-02
    java jvm javascript
  • Python Matplotlib基本用法详解
    目录Matplotlib1. 认识Matploblib1.1 Figure1.2 Axes1.3 Multiple Axes1.4 Axes Vs .pyplot2. 基本绘图2D2...
    99+
    2023-03-15
    Python Matplotlib用法 Python Matplotlib
  • 国外专用服务器的基本功能有哪些
    国外专用服务器的基本功能有:1、用户独享所有资源,包括CPU、内存、硬盘等硬件资源;2、支持资源超配额使用,能保证服务器的正常运行;3、用户拥有最高管理权限,可操控性极强;4、用户能自由使用故障诊断工具,如进行重启动、修复、重装、备份、实时...
    99+
    2024-04-02
  • 基于Vue实现Excel解析与导出功能详解
    目录前言基本介绍 代码实现 基本结构 上传解析Excel的导出 基本结构 导出Excel 总结前言 最近在整理日常开发中长涉及到的业务需求,正好想到了excel的解析与上传方面的事情...
    99+
    2024-04-02
  • Go语言数组方法详解:基本概念与用法
    Go语言数组方法详解:基本概念与用法 Go语言是一种由Google开发的编译型语言,它具有简洁、高效以及内置并发的特点,受到了广泛的关注和应用。在Go语言中,数组是一种基本的数据结构,...
    99+
    2024-04-02
  • 用实例解析Mysql索引类型与基本用法
    这篇文章主要用实例解析Mysql索引类型与基本用法,内容简而易懂,希望大家可以学习一下,学习完之后肯定会有收获的,下面让小编带大家一起来看看吧。本文实例讲述了Mysql索引类型与基本用法。分享给大家供大家参...
    99+
    2024-04-02
  • Android startActivityForResult的基本用法详解
    知识准备: 1、startActivityForResult(Intent intent, int requestCode):启动 Activity,同时等待该 Activity 返...
    99+
    2024-04-02
  • pytorchDataLoaderj基本使用方法详解
    目录一、DataLoader理解二、DataLoader基本使用方法定义数据集定义DataLoader在训练过程中遍历DataLoader使用DataLoader实现多GPU训练三、...
    99+
    2023-05-17
    pytorch DataLoader基本方法 pytorch DataLoader
  • Go语言函数的基本结构与用法详解
    Go语言函数的基本结构与用法详解 Go语言作为一门开发优雅、高效的编程语言,其函数是构建程序的基本组成单元之一。函数在Go语言中具有非常灵活且强大的功能,本文将详细介绍Go语言函数的基...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作