MYSQL-多表操作-外键约束

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: MYSQL-多表操作-外键约束

 简介:在一个项目当中,通常需要许多个表之间建立一定的联系才能够完成,所以我们需要在单表操作的基础之上学会如何多表操作

-- MYSQL当中的表跟表之间的联系可以大概的分为三种:

-- 1.一对一

-- 2.一对多 || 多对一 (相对的)

-- 3.多对多

多表操作--外键约束:

外键约束通常跟主键约束一起进行使用,例如,对于两个相互有关联的表来说,相关联字段的主键所在的表就叫做是主表,外键所在的表就是从表

-- 关键字:  foreign key


一:建立外键约束的要求:

1、在表上建立外键,主表应先存在。

2、一个表可以建立多个外键约束。

3、从表的外键列必须指向主表的主键列。

4、从表的外键列可以与主表参考的列名不同,但数据类型必须相同。


二:操作方法:有两种设置外键约束的方法:

-- 方法一:
create table if not exists bumen(
detpno varchar(20) primary key,
name VARCHAR(20)
);
 
create table if NOT exists emp(
eid VARCHAR(20) PRIMARY KEY,
name VARCHAR(20),
age int,
dept_id VARCHAR(20),
constraint bumen_emp-- 随便起的有关两个表之间联系的名称,方便之后进行删除 
FOREIGN key emp(dept_id) 
REFERENCES bumen(detpno) 
);
-- 方法二:
create table if NOT exists emp(
eid int PRIMARY KEY auto_increment,
name VARCHAR(20),
age int,
dept_id VARCHAR(20)
);
ALTER table emp add constraint bumen_emp
foreign key (dept_id)
REFERENCES bumen(detpno);


二:外键约束操作:

       1>.增加数据:

tips:

       1.必须首先给主键进行添加数据,之后才能添加从表的数据!两者之间存在某种联系

       2.在给从表添加数据的时候,不能随便的进行添加,要随时记得从表当中某些列跟主表有关系!基于主表的数据进行添加

insert into bumen VALUES('1001','销售部');
insert into bumen VALUES('1002','研发部');
insert into bumen VALUES('1003','财务部');
insert into bumen VALUES('1004','人事部');
 
insert into emp values(null,'乔峰',20,'1001');
insert into emp values(null,'段誉',21,'1001');
insert into emp values(null,'虚竹',23,'1001');
insert into emp values(null,'阿紫',18,'1002');
insert into emp values(null,'扫地僧',35,'1002');
insert into emp values(null,'李秋水',33,'1003');
insert into emp values(null,'鸠摩智',50,'1003');
 
-- 在这里,这条数据无法进行添加,是因为在主表当中并没有存在这个数据,所以从表无法根据主表进行添加!
insert into emp values(null,'天山童姥',20,'1005');

 2>删除数据:

               1.外键约束删除表的时候,只能够先删除从表,之后才能够删除主表,因为两者之间存在约束


               2.在删除表当中的数据上,主表的数据如果在从表当中有使用到,那么不能够随便删除,从表当中没有才能够删除


-- 示例:
DELETE from bumen where deptno='1001'; -- 无法删除,因为从表当中有相关的数据
DELETE from bumen where detpno='1004';-- 可以删除,因为从表当中没有存在有关1004的数据

  3.对于从表当中的数据,所有的数据都能够进行删除,并没有条件的限制

DELETE from emp where eid=5;
-- 也可以直接清空整个表当中的数据
DELETE from emp;
 
TRuncate emp;


三:外键约束删除:

-- 删除外键约束
alter table emp drop FOREIGN key bumen_emp;
-- alter table 从表名称 drop foreign 外键约束的名称


四:多对多表的操作:

两个表之间,可能有多对多之间的关联,所以,如果需要建立多对多之间的关系,就需要中间表将两者联系起来才行,因此,多对多的外键约束建立,实际上就是多个  一对多||多对一  联系起来即可

关键语句:alter table (从表表名)(tips:中间表的表名) add [constraint (名称) ]  foreign key (从表列)

references 主表名(主表列);

-- 首先需要先建立主表,以及中间的从表
create table if not exists student(
id int,
name VARCHAR(20) PRIMARY KEY,
age int,
gender VARCHAR(20)
);
 
CREATE table course(
id int,
course varchar(20) PRIMARY key
);
 
 
CREATE table mids(
name VARCHAR(20),
course VARCHAR(20),
score int
);
 
-- 给课程表添加数据
insert into course VALUES(1,'语文');
insert into course VALUES(2,'数学');
insert into course VALUES(3,'英语');
 
-- 建立两个主表跟从表之间的联系
-- tips:从表的外键列必须!指向主表的主键列才行!!!
alter table mids 
add CONSTRAINT mid_student
foreign key(name) references student(name);
 
alter table mids 
add CONSTRAINT mid_course
FOREIGN key(course)
REFERENCES course(course);
 
 
-- 给学生表当中先添加数据
insert into student VALUES(1,'王1',19,'男');
insert into student VALUES(2,'秦1',19,'男');
insert into student VALUES(3,'王2',18,'男');
DELETE from student;
-- 给中间表添加数据
DELETE from mids;
insert into mids VALUES('王1','语文',98);
insert into mids VALUES('王1','数学',97);
insert into mids VALUES('秦1','英语',96);
insert into mids VALUES('秦1','语文',99);
insert into mids VALUES('王2','英语',100);
 
select * from mids where name like '王%' ;
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
SQL 运维 关系型数据库
MySQL 中 GRANT 操作会引起复制中断吗?
GRANT 操作并不是一个原子性操作,不管执行成功与否,都会触发一个隐式重载授权表的行为。 在生产环境中需要规范用户创建及授权的操作,不推荐使用 DML 语句去直接变更 mysql.user 表,可能会引发其他的问题,若使用了 DML 语句进行变更, 需要手工执行 flush privileges。
57 4
|
3月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
47 0
|
5天前
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略
|
8天前
|
关系型数据库 MySQL 测试技术
MySQL外键使用的考量与建议
综上所述,虽然MySQL的外键提供了一种强大的工具来维护数据之间的一致性和完整性,但在决定是否使用外键时,需要权衡其带来的好处和潜在的性能影响。通过仔细的规划和测试,可以最大化地利用外键的优势,同时避免一些常见的陷阱。
24 3
|
9天前
|
关系型数据库 MySQL 测试技术
MySQL外键使用的考量与建议
综上所述,虽然MySQL的外键提供了一种强大的工具来维护数据之间的一致性和完整性,但在决定是否使用外键时,需要权衡其带来的好处和潜在的性能影响。通过仔细的规划和测试,可以最大化地利用外键的优势,同时避免一些常见的陷阱。
12 1
|
24天前
|
存储 关系型数据库 MySQL
MySQL数据库基础:约束
约束是对数据库表中字段施加的规则,确保数据的正确性、有效性和完整性。主要分为非空约束、唯一约束、默认约束、主键约束和外键约束。非空约束禁止字段值为null;唯一约束确保字段值唯一,允许null值重复;默认约束设定默认值;主键约束结合非空与唯一约束,并可设为自增型;外键约束则通过关联其他表的主键,保证数据一致性。检查约束确保字段值满足特定条件。
31 1
|
2月前
|
数据采集 关系型数据库 MySQL
在 MySQL 中使用约束
【8月更文挑战第11天】
39 0
在 MySQL 中使用约束
|
3月前
|
存储 关系型数据库 文件存储
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
面试题MySQL问题之简单的SELECT操作在MVCC下加锁如何解决
40 2
|
3月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版操作报错合集之从mysql读数据写到hive报错,是什么原因
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。