当前位置: 首页 > news >正文

MySQL—约束—外键约束(基础)

一、引言

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

举个例子:

提示说明:(有两张表)

(1)员工表:emp

id:主键、姓名、年龄、工作、薪资、入职时间、上级领导id 以及部门id。这个部门id指定了当前员工是属于哪一个部门的。

(2)外键约束

它关联的另外一张表dept(部门表)的主键id。此时 dept_id 就是员工表当中的一个外键。通过这个外键,让两张表的数据之间产生连接。

(3)

在这种主外键的关系中,把员工表称为子表(具有外键的表),部门表称为父表(外键所关联的这张表)。有时候叫做主表和从表。

(4)目前这种外键关系,它只是逻辑上有这么一个外键。知道外键 dept_id 它关联的就是部门表的主键 id ,但是在数据库层面,并未建立物理外键关联,是无法保证数据的一致性和完整性的。也就是意味着我们直接删除了部门表中的一条数据,如将1号部门删除掉了,此时员工表的数据会不会有变化?其实是不会有任何变化,因为在数据库层面两张表没有任何的关系,只是在逻辑上有一个关系

接下来去 DataGrip 查看具体情况。

二、创建基本表结构

(1)为两张表做准备工作

(创建表结构并插入基本数据)

部门表:dept 

CREATE TABLE dept (id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,name VARCHAR(50) NOT NULL COMMENT '部门名称'
) COMMENT '部门表';
INSERT INTO dept (id, name) VALUES (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');

表数据插入成功!

员工表:emp

CREATE TABLE emp (id INT AUTO_INCREMENT COMMENT 'ID' PRIMARY KEY,name VARCHAR(50) NOT NULL COMMENT '姓名',age INT COMMENT '年龄',job VARCHAR(20) COMMENT '职位',salary INT COMMENT '薪资',entrydate DATE COMMENT '入职时间',managerid INT COMMENT '直属领导ID',dept_id INT COMMENT '部门ID'
) COMMENT '员工表';INSERT INTO emp (id, name, age, job, salary, entrydate, managerid, dept_id) VALUES (1,'金庸',66,'总裁',20000,'2000-01-01',null,5),(2,'张无忌',20,'项目经理',12500,'2005-12-05',1,1),(3,'杨逍',33,'开发',8400,'2000-11-03',2,1),(4,'韦小笑',48,'开发',11000,'2002-02-05',2,1),(5,'常遇春',43,'项目经理',10500,'2004-09-07',3,1),(6,'小昭',19,'程序员鼓励师',6600,'2004-10-12',2,1);

表数据插入成功!

三、问题与解决

目前这两张表逻辑上有着关联,员工表中的部门id:dept_id 对应着部门表的 id 。但是我们没有设置它们之间的物理外键,就无法保证数据的完整性。

如果没有设置,那么当我删除部门表中的任意一个id,那么员工表的数据没有任何变化,就会出现数据不完整和一致性的问题。所以我们就要去学习建立外键关联。

四、添加外键约束

(1)语法

添加外键。语法有两种情况。

第一种(是在创建表的时候):直接添加

第二种: (表结构创建好了之后):额外增加这样的一个外键就可以用了

注意

1、ALTER TABLE 表名 :修改指定表名

2、ADD CONSTRAINT:add constraint :添加 限制

3、外键名称可以自己定义

4、ROREIGN KEY :foreign key: 外键 

5、REFERENCES :references:参考

(2)对上面的两张表进行操作 

给员工表 emp 添加外键。

/* add constraint 外键  括号里代表的外键字段 */
ALTER TABLE emp ADD CONSTRAINT fk_emp_dept_id FOREIGN KEY (dept_id) REFERENCES dept(id);

执行前的表视图:

执行后的表视图:

这时就成功添加好了外键约束了。

(3)测试外键的作用是否对数据的完整性有用 

外键添加成功之后。这次测试一下再去删除部门表 dept 中的id字段,看能不能删除成功?

因为要删除父表 dept 中id为1的字段,而子表 emp 中的字段dept_id 还有那么多值关联着id=1的记录,不能直接删除,这样就保证了数据的一致性和完整性。

五、删除外键约束

语法:

注意

1、ALTER TABLE :修改指定表

2、DROP:删除

操作:

ALTER TABLE emp DROP FOREIGN KEY fk_emp_dept_id;

外键删除成功! 

这篇博客的所有内容就到这了。 

相关文章:

  • Scala 柯里化、sortBy方法
  • Linux配置java,maven,marshalsec环境
  • 实现Dropdown下拉菜单监听键盘上下键选中功能-React
  • vue3状态管理,pinia的使用
  • JavaScript、Kotlin、Flutter可以开发鸿蒙APP吗?
  • HTTP --tcp和keep-alive
  • oracle linux7安装oracle11g0204
  • 强化学习(一) 基本概念和赌博机问题
  • 【量算分析工具-获取高程】GeoServer改造Springboot番外系列八
  • 应用案例|精密制造中使用复合机器人得到显著提升
  • MySQL表的增删改查初阶(上篇)
  • Kubernetes集群Pod控制器
  • 解析Java中1000个常用类:ProcessHandle.Info类,你学会了吗?
  • 执行shell脚本时为什么要写成./test.sh,而不是test.sh?
  • 数据结构--关键路径
  • [译]Python中的类属性与实例属性的区别
  • 《深入 React 技术栈》
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【Leetcode】104. 二叉树的最大深度
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017-09-12 前端日报
  • Java多线程(4):使用线程池执行定时任务
  • springboot_database项目介绍
  • vue数据传递--我有特殊的实现技巧
  • 回流、重绘及其优化
  • 讲清楚之javascript作用域
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 怎样选择前端框架
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 阿里云移动端播放器高级功能介绍
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • (03)光刻——半导体电路的绘制
  • (k8s)Kubernetes 从0到1容器编排之旅
  • (Ruby)Ubuntu12.04安装Rails环境
  • (SERIES12)DM性能优化
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .gitignore文件设置了忽略但不生效
  • .Net MVC + EF搭建学生管理系统
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET开源、简单、实用的数据库文档生成工具
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @EnableWebMvc介绍和使用详细demo
  • @Pointcut 使用
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @基于大模型的旅游路线推荐方案
  • [ linux ] linux 命令英文全称及解释
  • [ vulhub漏洞复现篇 ] Django SQL注入漏洞复现 CVE-2021-35042
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [2017][note]基于空间交叉相位调制的两个连续波在few layer铋Bi中的全光switch——
  • [Android] Android ActivityManager
  • [C/C++入门][ifelse]20、闰年判断
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [GN] Vue3.2 快速上手 ---- 核心语法2