【Mysql】多表、外键约束

多表

1.1 多表简述
实际开发中,一个项目通常需要很多张表才能完成。
例如一个商城项目的数据库,需要有很多张表:用户表、分类表、商品表、订单表…
1.2 单表的缺点
1.2.1 数据准备

  1. 创建一个数据库 db3
CREATE DATABASE db3 CHARACTER SET utf8;
  1. 数据库中 创建一个员工表 emp ,
    包含如下列 eid, ename, age, dep_name, dep_location
    eid 为主键并 自动增长, 添加 5 条数据
-- 创建emp表 主键自增
CREATE TABLE emp(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),age INT ,dep_name VARCHAR(20),dep_location VARCHAR(20)
);-- 添加数据 INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('张百万', 20, '研发部', '广州'); INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('赵四', 21, '研发部', '广州'); INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('广坤', 20, '研发部', '广州'); INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('小斌', 20, '销售部', '深圳'); INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('艳秋', 22, '销售部', '深圳'); INSERT INTO emp (ename, age, dep_name, dep_location) VALUES ('大玲子', 18, '销售部', '深圳'); 

1.2.2 单表的问题
•冗余, 同一个字段中出现大量的重复数据
在这里插入图片描述

1.3 解决方案
1.3.1设计为两张表
1)多表方式设计
•department 部门表 : id, dep_name, dep_location
•employee 员工表: eid, ename, age, dep_id
2) 删除emp表, 重新创建两张表

-- 创建部门表
-- 一方,主表
CREATE TABLE department(id INT PRIMARY KEY AUTO_INCREMENT,   dep_name VARCHAR(30),  dep_location VARCHAR(30)
);-- 创建员工表
-- 多方 ,从表
CREATE TABLE employee(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),age INT,dept_id INT
);

3)添加部门表 数据

-- 添加2个部门 
INSERT INTO department VALUES(NULL, '研发部','广州'),(NULL, '销售部', '深圳'); SELECT * FROM department; 
  1. 添加员工表 数据
-- 添加员工,dep_id表示员工所在的部门 
INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('广坤', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('小斌', 20, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('大玲子', 18, 2); SELECT * FROM employee;

1.3.2 表关系分析
部门表与员工表的关系
1.员工表中有一个字段dept_id 与部门表中的主键对应,员工表的这个字段就叫做 外键。
2.拥有外键的员工表 被称为从表, 与外键对应的主键所在的表叫做主表。
在这里插入图片描述

1.3.3 多表设计上的问题
当我们在 员工表的 dept_id 里面输入不存在的部门id ,数据依然可以添加 显然这是
不合理的。

-- 插入一条 不存在部门的数据
INSERT INTO employee (ename,age,dept_id) VALUES('无名',35,3);

在这里插入图片描述

实际上我们应该保证,员工表所添加的 dept_id , 必须在部门表中存在.
解决方案:
•使用外键约束,约束 dept_id ,必须是 部门表中存在的id
1.4 外键约束
1.4.1 什么是外键
•外键指的是在 从表中 与主表的主键对应的那个字段,比如员工表的 dept_id,就是外键。
•使用外键约束可以让两张表之间产生一个对应关系,从而保证主从表的引用的完整性。

在这里插入图片描述

多表关系中的主表和从表
•主表: 主键id所在的表, 约束别人的表。
•从表: 外键所在的表多, 被约束的表。
在这里插入图片描述

1.4.2 创建外键约束
语法格式:
1)新建表时添加外键

[CONSTRAINT] [外键约束名称] FOREIGN KEY(外键字段名) REFERENCES 主表名(主键字段名) 

2)已有表添加外键

ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主 键字段名);
  1. 重新创建employee表, 添加外键约束
-- 先删除 employee表
DROP TABLE employee;-- 重新创建 employee表,添加外键约束
CREATE TABLE employee(eid INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(20),age INT,dept_id INT,-- 添加外键约束CONSTRAINT emp_dept_fk FOREIGN KEY(dept_id) REFERENCES department(id)
);
  1. 插入数据
-- 正常添加数据 (从表外键 对应主表主键)
INSERT INTO employee (ename, age, dept_id) VALUES ('张百万', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('赵四', 21, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('广坤', 20, 1); 
INSERT INTO employee (ename, age, dept_id) VALUES ('小斌', 20, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('艳秋', 22, 2); 
INSERT INTO employee (ename, age, dept_id) VALUES ('大玲子', 18, 2); -- 插入一条有问题的数据 (部门id不存在)
-- Cannot add or update a child row: a foreign key constraint fails 
INSERT INTO employee (ename, age, dept_id) VALUES ('错误', 18, 3); 

4)添加外键约束,就会产生强制性的外键数据检查, 从而保证了数据的完整性和一致性
在这里插入图片描述

1.4.3 删除外键约束
语法格式

alter table 从表 drop foreign key 外键约束名称

删除 外键约束

-- 删除employee 表中的外键约束,外键约束名 emp_dept_fk
ALTER TABLE employee DROP FOREIGN KEY emp_dept_fk;

再将外键 添加回来, 语法格式

ALTER TABLE 从表 ADD [CONSTRAINT] [外键约束名称] FOREIGN KEY (外键字段名) REFERENCES 主表(主 键字段名);

SQL示例

-- 可以省略外键名称, 系统会自动生成一个
ALTER TABLE employee ADD FOREIGN KEY (dept_id) REFERENCES department (id);

1.4.4外键约束的注意事项
1)从表外键类型必须与主表主键类型一致 否则创建失败.
在这里插入图片描述

  1. 添加数据时, 应该先添加主表中的数据.
-- 添加一个新的部门
INSERT INTO department(dep_name,dep_location) VALUES('市场部','北京');-- 添加一个属于市场部的员工
INSERT INTO employee(ename,age,dept_id) VALUES('老胡',24,3);
  1. 删除数据时,应该先删除从表中的数据.
-- 删除数据时 应该先删除从表中的数据
-- 报错 Cannot delete or update a parent row: a foreign key constraint fails
-- 报错原因 不能删除主表的这条数据,因为在从表中有对这条数据的引用
DELETE FROM department WHERE id = 3;
-- 先删除从表的关联数据
DELETE FROM employee WHERE dept_id = 3;-- 再删除主表的数据
DELETE FROM department WHERE id = 3;

1.5物理外键和逻辑外键
•物理外键
物理外键实际通过数据库语法设置为外键.
•逻辑外键
逻辑外键是指,字段设置时不需要额外通过数据库语法设置成外键关联.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Segment any Text:优质文本分割是高质量RAG的必由之路

AI应用开发相关目录 本专栏包括AI应用开发相关内容分享,包括不限于AI算法部署实施细节、AI应用后端分析服务相关概念及开发技巧、AI应用后端应用服务相关概念及开发技巧、AI应用前端实现路径及开发技巧 适用于具备一定算法及Python使用基础的人群 AI应用开发流程概…

网络文化经营许可证(文网文)办理全面讲解

随着互联网时代的飞速发展,互联网早已渗透到人们的生活中,各类直播、短视频成为大家生活娱乐必不可少的一部分。注册一家从事互联网行业的企业是一个不错的选择。那互联网企业需要办理什么证件资质呢?在互联网行业从事盈利文化活动必须持有网…

【精品方案】智能制造之路(93页PPT)

引言:智能制造之路:革新制造业的引领之旅 随着科技的迅猛发展,特别是人工智能、物联网、大数据等技术的不断进步,制造业正迎来一场深刻的变革。智能制造,作为这场变革的核心,正逐步成为推动产业升级和转型发…

大模型课程资料-全网最火29套全栈大模型项目实践

29套AI全栈大模型项目实战,人工智能视频课程-多模态大模型,微调技术训练营,大模型多场景实战,AI图像处理,AI量化投资,OPenCV视觉处理,机器学习,Pytorch深度学习,推荐系统…

【LLM】一分钟带你了解Agent工作流四范式

文章目录 1. 大模型直接生成-generation2. 大模型充当工具使用-tool3. 大模型执行思维链-Planning4. 多大模型Agent合作-multiagent collaboration 1. 大模型直接生成-generation 通过提示词,大模型直接生成想要的结果: 2. 大模型充当工具使用-tool …

拥抱数字化未来,如何以费控驱动业务发展?

管理费用是企业运营中仅次于人力成本的第二大可控成本,一般会占到企业年度收入的5%—10%,但多数企业存在费用疏于管理、费用管理制度流于纸面难落地、费用浪费严重等问题。 如果不进行科学管理,有专家表示,估计企业每年至少有10%的…

vue总结

1.什么是VUE? Vue就是一套用于构建用户界面的渐进式框架,与其他框架不同的是,Vue被设计为可以自底向上逐渐应用.Vue的核心库只关注图层,不仅容易上手,还便于与第三方库或既有项目整合. 2.Vue的优点 体积小 高效率 双向数据绑定,简化Dom操作 通过MVVM思想实现数据的双向绑定…

Pixea Plus for Mac:图像编辑的极致体验

Pixea Plus for Mac 是一款专为 Mac 用户设计的强大图像编辑软件。凭借其卓越的性能和丰富的功能,它为用户带来了前所未有的图像编辑体验。无论是专业的设计师,还是业余的摄影爱好者,Pixea Plus 都能满足您对于图像编辑的各种需求。 Pixea P…

浏览器扩展V3开发系列之 chrome.cookies 的用法和案例

【作者主页】:小鱼神1024 【擅长领域】:JS逆向、小程序逆向、AST还原、验证码突防、Python开发、浏览器插件开发、React前端开发、NestJS后端开发等等 chrome.cookies API能够让我们在扩展程序中去操作浏览器的cookies。 在使用 chrome.cookies 要先声明…

软考系统架构师考试考点整理就看这一篇

软考系统架构师考试考点整理就看这一篇 最近软考成绩出来了不少同学与笔者沟通,聊到软考现在越来越难了,考了两三次都没过,也有不少新同学咨询软考考试的一些福利政策,投入大量的物力,财力,精力&#xff0c…

如何借助物联网实现土壤监测与保护

如何借助物联网实现土壤监测与保护 高标准农田信息化是指利用现代信息技术,如物联网、大数据、云计算等,对农田进行数字化、智能化的管理,以提高农田的生产效率和可持续发展能力。其中,土壤监测与保护是农田信息化的重要内容之一…

低代码:释放企业创新力的钥匙

近年来,随着信息技术的不断发展,企业对于快速开发应用程序的需求越来越迫切。然而,传统的软件开发过程常常耗时费力,限制了企业的创新潜力。于是,低代码应运而生,成为解决开发难题的一把利器。 低代码开发…

智能聊天AI机器人网页怎么聊?这样做很简单

智能聊天AI机器人网页怎么聊?随着科技的飞速发展,智能聊天AI机器人已经逐渐渗透到我们的日常生活中,为我们提供了更加便捷、高效的交流方式。在网页上,这些智能聊天机器人以其独特的魅力,为我们打开了与机器对话的新世…

Epic商店登录时一直转圈圈怎么回事?Epic登录转圈圈解决办法

很多游戏玩家都喜欢在Epic商店上面免费领取游戏,但是经常在登陆领取的过程中,遇到Epic账号登陆不上的问题,登陆界面一直转圈圈,下面分享一下具体解决办法,帮助大家顺利流畅登陆,轻松喜加一。 如果遇到Epic商…

低内阻、高性能数字音频功放芯片-NTP8938

由工采网代理的韩国NF(耐福)NTP8938是一款支持2X30W低内阻、高性能数字音频功放芯片;采用QFN40封装,芯片内置DSP集成了多功能数字音频信号处理功能,高性能,高保真。 芯片工作电压范围:5V&#x…

python实现可视化大屏(django+pyechars)

1.实现效果图 2.对数据库进行迁移 python manage.py makemigrations python manage.py migrate 3.登录页面 {% load static%} <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport"…

【回溯算法题记录】组合总和题汇总

组合总和 39. 组合总和题目描述初始思路后续分析 40. 组合总和 II题目描述思路&#xff08;参考代码随想录&#xff09; 39. 组合总和 题目&#x1f517; 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数…

3d渲染软件有哪些(2),渲染100邀请码1a12

3D渲染软件有很多&#xff0c;上次我们介绍了几个&#xff0c;这次我们接着介绍。 1、Arnold Arnold渲染器是一款基于物理算法的电影级渲染引擎&#xff0c;它具有渲染质量高、材质系统丰富、渲染速度快等特点&#xff0c;是3D设计师的极佳选择。2、Octane Render Octane Ren…

【全网最完整】Open CASCADE Technology (OCCT) 构建项目,QT可视化操作,添加自定义测试内容

前言 本文为了记录自己在实习的过程中&#xff0c;学习到的有关OCCT开源项目的搭建工作&#xff0c;旨在教会小白从0开始下载开源项目及环境搭配&#xff0c;以及如何添加自定义测试内容&#xff0c;最终结果展示如下&#xff1a; 1、项目下载 本项目共需要使用四个工具&#…

如何快速解决验证码图像问题 | 最佳图像(OCR)验证码解决工具

你是否曾经遇到过陷入一个看似无尽的 CAPTCHA 挑战中&#xff0c;努力识别扭曲的字符或数字&#xff1f;这些令人抓狂的 CAPTCHA 是为了确保你是人类而不是机器人&#xff0c;但它们也给真正的用户带来了头痛。那么&#xff0c;有没有快速解决这些 CAPTCHA 图像的方法&#xff…