外键(FOREIGN KEY)

article/2025/9/14 4:12:41

引子:把所有数据都存放于一张表的弊端

    1、表的组织结构复杂不清晰
    2、浪费空间
    3、扩展性极差

为了解决上述的问题,就需要用多张表来存放数据。

表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。

处理表之间关系问题就会利用到FOREIGN KEY

多对一关系:

寻找表与表之间的关系的套路
    举例:雇员表:emp表   部门:dep表
        part1:
        1、先站在表emp的角度
        2、去找表emp的多条记录能否对应表dep的一条记录。
        3、翻译2的意义:
            左表emp的多条记录==》多个员工
            右表dep的一条记录==》一个部门
            最终翻译结果:多个员工是否可以属于一个部门?
            如果是则需要进行part2的流程

        part2:
        1、站在表dep的角度
        2、去找表dep的多条记录能否对应表emp的一条记录
        3、翻译2的意义:
            右表dep的多条记录==》多个部门
            左表emp的一条记录==》一个员工

            最终翻译结果:多个部门是否可以包含同一个员工
            如果不可以,则可以确定emp与dep的关系只一个单向的多对一
            如何实现?
            此时就可以用到外键了,在emp表中新增一个dep_id字段,该字段指向dep表的id字段

foreign key会带来什么样的效果?
约束1:在创建表时,先建被关联的表dep,才能建关联表emp
create table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60)
);create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default 'male',dep_id int,foreign key(dep_id) references dep(id)
);
约束2:在插入记录时,必须先插被关联的表dep,才能插关联表emp
insert into dep(dep_name,dep_comment) values
('教学部','辅导学生学习,教授课程'),
('公关部','处理公关危机'),
('技术部','开发项目,研究技术');insert into emp(name,gender,dep_id)  values
('monicx0','male',1),
('monicx1','male',2),
('monicx2','male',1),
('monicx3','male',1),
('lili','female',3);


约束3:更新与删除都需要考虑到关联与被关联的关系。

解决方案:

1、先删除关联表emp,再删除被关联表dep,准备重建

2、重建: 新增功能,同步更新,同步删除
create table dep(id int primary key auto_increment,dep_name char(10),dep_comment char(60)
);create table emp(id int primary key auto_increment,name char(16),gender enum('male','female') not null default 'male',dep_id int,foreign key(dep_id) references dep(id)on update cascadeon delete cascade
);
此时再去修改:


得到结果:


此时再去删除:


得到结果:


多对多的关系:

两张表记录之间是一个双向的多对一关系,称之为多对多关系。
如何实现?
建立第三张表,该表中有一个字段foreign key左表的id,还有一个字段是foreign key右表的id
create table author(id int primary key auto_increment,name char(16)
);create table book(id int primary key auto_increment,bname char(16),price int
);insert into author(name) values
('monicx1'),
('monicx2'),
('monicx3')
;
insert into book(bname,price) values
('python从入门到入土',200),
('liunx从入门到入土',400),
('java从入门到入土',300),
('php从入门到入土',100)
;
#建立第三张表:
create table author2book(id int primary key auto_increment,author_id int,book_id int,foreign key(author_id) references author(id)on update cascadeon delete cascade,foreign key(book_id) references book(id)on update cascadeon delete cascade
);insert into author2book(author_id,book_id) values
(1,3),
(1,4),
(2,2),
(2,4),
(3,1),
(3,2),

一对一关系

左表的一条记录唯一对应右表的一条记录,反之也一样
create table customer(id int primary key auto_increment,name char(20) not null,qq char(10) not null,phone char(16) not null
);create table student(id int primary key auto_increment,class_name char(20) not null,customer_id int unique, #该字段一定要是唯一的foreign key(customer_id) references customer(id) #此时外键的字段一定要保证uniqueon delete cascadeon update cascade
);



http://chatgpt.dhexx.cn/article/BSAgaQXQ.shtml

相关文章

什么是外键? 为什么需要外键?怎么使用外键?

首先我们先思考一个问题: 如何将京东"fuliuqingfeng"的用户信息及其多个邮寄商品地址保存到数据库中? 我们第一步会这样操作实现: create table user_info(id char(36) primary key,user_name varchar(30) not null,password varchar(30) …

MySQL外键(详解)

MySQL外键(详解) 什么是外键:    外键是指引用另外一个表中的一列或多列数据,被引用的列应该具有主键约束或者唯一性约束(简单来说外键是另一个表的主键或者唯一约束)。外键可以有重复的, 可以是空值&…

C/C++unlink函数的使用

一、头文件 #include<unistd.h> 二、函数原型 int unlink(const char *pathname); 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意&#xff1a; 执行unlink()函数并不一定会真正的删除文件&#xff0c;它先会检查文件…

Linux下unlink函数的使用

一、头文件 #include<unistd.h> 二、函数原型 int unlink(const char *pathname); 三、函数介绍 unlink()函数功能即为删除文件。执行unlink()函数会删除所给参数指定的文件。 注意&#xff1a; 执行unlink()函数并不一定会真正的删除文件&#xff0c;它先会检查文件系…

Universal link的坑

当你觉得Universal link所有配置都没问题&#xff0c;但是通过浏览器打开Universal Link没有命中的时候看下这里 看了很多篇文章对比了Universal Link配置和流程之后没问题&#xff0c;浏览器打开还是不生效&#xff0c;最终在最关键的配置apple-app-site-association文件破案了…

unlink 和 remove 的区别

Linux下开发的时候,会经常使用unlink来删除文件的,而用C的时候,经常用remove删除文件. 这两者的去区别通过man手册发现&#xff1a;  当remove() 中的pahtname指定为目录时,相当于调用rmdir 删除目录,当remove() 中的pathname指定问文件时,相当于调用unlink 删除文件链接 所以…

004link()unlink()_LINUX

Linux的学习笔记 link、unlink1. 共享盘块2. link() 为已经存在的文件创建目录项&#xff08;硬链接&#xff09;头文件包含和函数声明 3. unlink() 删除一个文件的目录项头文件包含和函数声明Linux下删除文件的机制&#xff1a;demo 4. unlink 使用注意及隐性回收demo4.1 编译…

CTF PWN之heap入门 unlink

环境 ubuntu20 pwndbg patchelf glibc-all-in-one 为什么要用ubuntu不用kali&#xff0c;这里不做解释&#xff0c;总之就是自己在搭环境时出现了各种问题&#xff0c;但用ubuntu20不会出现&#xff0c; pwndbg&#xff0c;打pwn题必备&#xff0c;具体安装过程见gdb与ped…

NPM报错 Error: EPERM: operation not permitted, unlink......解决办法和清除缓存。

由于国内外环境因素&#xff0c;npm install安装依赖的时候经常会出现各种问题&#xff0c;特别是“Error: EPERM: operation not permitted, unlink…”这个错误。 在这里插入图片描述 这个错误因为报错信息的误导性&#xff0c;导致很多网上提出的解决办法都是什么设置权限…

vue 启项目报错Error: EPERM: operation not permitted, unlink

使用npm install安装依赖之后&#xff0c;有时候存在网络或其他问题安装不上个别依赖&#xff0c;其项目失败&#xff0c;报错 当启项目时报错&#xff1a;Error: EPERM: operation not permitted, unlink 此问题困扰好久&#xff0c;刚开始以为和其他人遇到的问题相似是因为管…

好好说话之unlink

堆溢出的第三部分unlink&#xff0c;这可能是有史以来我做的讲解图最多的一篇文章了累死 。可能做pwn的人都应该听过unlink&#xff0c;见面都要说声久仰久仰。学unlink的时候走了一些弯路&#xff0c;也是遇到了很多困扰的问题&#xff0c;会在后面的内容中做出标注。由于写的…

Unlink

Author&#xff1a;ZERO-A-ONEDate&#xff1a;2021-07-03 一、unlink的原理 简介&#xff1a;俗称脱链&#xff0c;就是将链表头处的free堆块unsorted bin中脱离出来然后和物理地址相邻的新free的堆块合并成大堆块&#xff08;向前合并或者向后合并&#xff09;&#xff0c;再…

unlink快速入门

0x01 正常unlink 当一个bin从记录bin的双向链表中被取下时&#xff0c;会触发unlink。常见的比如&#xff1a;相邻空闲bin进行合并&#xff0c;malloc_consolidate时。unlink的过程如下图所示&#xff08;来自CTFWIKI&#xff09;主要包含3个步骤&#xff0c;就是这么简单。 …

Linux常用命令——unlink命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) unlink 系统调用函数unlink去删除指定的文件 补充说明 unlink命令用于系统调用函数unlink去删除指定的文件。和rm命令作用一样&#xff0c;都是删除文件。 语法 unlink(选项)(参数)选项 --help&#xff1a;…

element table表格,动态生成表头,基于可拖拽组件,拖动排序

效果展示 使用步骤 所需页面根据解释粘入 表格页面(父组件).txt 中代码&#xff0c; 引入dragList.vue组件 1.表格页面(父组件) <dragList radio"ssss" ></dragList> //引用子组件<el-tablev-if"asa":data"tableData"ro…

vue-draggable的多列拖动与拷贝拖拽(不删除源数据列)

vue-draggable的多列拖动与拷贝拖拽&#xff08;不删除源数据列&#xff09; Demo所用属性所遇困难源码 Demo 官方文档 录屏软件&#xff1a;screenToGif (将视频转为Gif&#xff0c;我认为简单又好操作) 我深知&#xff0c;文字的感知不如图片&#xff0c;图片的感知不如视频…

【JavaScript】列表拖拽升级,支持双击添加和时间轴左右拖动

TOC H5实现时间揍拖动 实现双击文件列表的项添加到时间揍的最后一条。 时间轴里可以左右拖动位置。 主要代码&#xff1a; /*** 时间轴拖动结束* param $event* constructor*/ const lineDragEnd ( $event ) > {console.log( 时间轴拖动结束 , $event )console.log(移动了,…

echarts拖拽echarts实现多条可拖动节点的折线图

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <script src="js/echarts/echarts.js"></script> <title>在指定位置画多个点</title> <style> …

html拖拽页面特效,div+css实现网页模块或栏目拖动(即拖拽效果)

//为Number增加一个属性,判断当前数据类型是否是数字 Number.prototype.NaN0function(){return isNaN(this)?0:this;} //全局变量 var iMouseDownfalse; var dragObjectnull; //获得鼠标的偏移量(对象2-对象1) function getMouseOffset(target,ev) { evev||window.event; var …

RecyclerView实现Item可拖拽(拖动、删除)

RecyclerView实现Item可拖拽&#xff08;拖动、删除&#xff09; 话不多说&#xff0c;先附上效果图&#xff1a; ItemTouchHelper 这是一个RecyclerView的工具&#xff0c;提供了drag & swipe 的功能&#xff0c;可以帮助我们处理RecyclerView中的Item的拖拽和滑动事件…