只知道删除单张表的数据?不知道删除多张表的数据?

news2024/11/14 22:04:09

一些废话

可能在某某一天,你在表删除表数据的时候,不想一张表一张表的去删除,想把两个表的数据同时删除;然后你就会去搜索,然后你就很有很有很有很有可能会看到 me 的这篇优质(呸!!!)文章了~

嗯,没错,是这么个道理......

 

本文章赞助商:DataGrip(不是广告哇!!!Σ( ° △ °|||)︴)。

目录

一、删除多表数据

二、删除多表数据(两张表有外键关系)

2.1、设置外键

方法一:SQL 语句 

方法二:图形化界面

2.2、解决方法

方法一(简单版):关闭外键约束

方法二(麻烦版):修改删除/更新行为


一、删除多表数据

我这里有两张表,学生表(student)和学生成绩表(achievement)。

/*1、学生表*/
create table student(
    ID int,
    Name varchar(20)
);

/*给学生表插入数据*/
insert into student(ID, Name)
values (1,'海绵宝宝'),
       (2,'派大星'),
       (3,'章鱼哥'),
       (4,'蟹老板'),
       (5,'痞老板'),
       (6,'珊迪'),
       (7,'小蜗');



/*2、学生成绩表*/
create table achievement(
    ID int primary key auto_increment,
    Mark int
);

/*给学生成绩表插入数据*/
insert into achievement(ID, Mark)
values (1,91),
       (2,97),
       (3,88),
       (4,87),
       (5,84),
       (6,80),
       (7,81);
/*查询两张表的数据*/
select * from student;
select * from achievement;

输出结果: 

student:学生表

achievement:学生成绩表 

然后,我有个需求:要删除两个表中关于“小蜗”的记录。

如果你没学过多张表的数据删除的话,你就会分别从两张表去删除:

delete from student where Name = '小蜗';

delete from achievement where ID = 7;

当你学了多张表的数据删除的话,你就可以把两个表的数据根据条件连接起来进行删除:

语法:delete 表1,表2 from 表1,表2 where 条件;

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Student.Name = '小蜗';

要注意的点:

1、多张表删除数据,from 前面和 from 后面都要接要删除的表名(要删除几张表 from 前后就写几张表的表名),表名前后个数要保持一致;

如下:

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Student.Name = '小蜗';

2、多张表删除数据,不能给表取别名,只能用表名,如果有连接条件也只能用表名进行连接。

/*查询两张表的数据*/

select * from student;
select * from achievement;

删除成功!!!

输出结果: 

student:学生表

achievement:学生成绩表 

 

“小蜗” -1。喵~

小蜗是只猫!!!震惊我 100 年!!!😱😱😱

二、删除多表数据(两张表有外键关系)

打个预防针:这里面会涉及很多外键知识,只想看关于外键的删除多表数据,直接看 2.2、解决方法 就可以了。

还有最后一点要说的是,如果你创建外键后外键没有效果的话,可以参考该文章:

MySQL 数据库创建不了外键约束_^O^——的博客-CSDN博客

2.1、设置外键

方法一:SQL 语句 

语法:alter table 子表 add constraint 外键的名称 foreign key(子表中要建立成外键的字段名) references 父表(父表中外键要关联的字段名);

子表:建立外键的表;

外键的名称:自己取(注意哇,不要搞混淆了,这里写的是要你自己取的,而不是外键字段名的名称,虽然也不是不可以啦~);

父表:外键所关联的表;

因为要演示两张表有外键关系的删除,所以我把 student(学生表)的 ID 字段设置为 外键字段,关联 achievement(学生成绩表)的 主键 ID 字段;

alter table student add constraint fk_student_ID foreign key(ID) references achievement(ID);

如图:


 

注意,科普一下:外键不一定要是另一个表的主键(primary key:主键约束),也可以是另一个表的唯一值(unique:唯一约束)。

因为外键和另一张表所关联的字段,值是不能重复(而主键约束是一行数据的唯一标识,非空且唯一;唯一约束也能保证该字段的所有数据都是唯一、不重复的);

并且,建立外键最重要的两点是:

☝️、双方字段类型要保持一致,字段类型长度可以不一致。

演示:

我把 student(学生表)要建立成外键的字段 ID 改成 tinyint 小整形类型,外键所关联的achievement(学生成绩表)的字段主键 ID 还是 int 类型。

/*学生表*/
create table student(
    ID tinyint,
    Name varchar(20)
);

/*学生成绩表*/
create table achievement(
    ID int primary key auto_increment,
    Mark int
);

我再次插入外键关系:

alter table student add constraint fk_student_ID foreign key(ID) references achievement(ID);

会看到,他报错了!!!报的是外键约束不正确的错误!!!

[HY000][1005] Can't create table `test2`.`student` (errno: 150 "Foreign key constraint is incorrectly formed")

✌️、双方数据要保持一致,具体演示点击下面链接:

[23000][1452] Cannot add or update a child row: a foreign key constraint fails (`test2`.`#sql-1238_5_^O^——的博客-CSDN博客


 

方法二:图形化界面

1、点击要设置成为外键的表,右键 Modify Table...

 

2、选择 ①Foreign Keys,点击 ②“+” 号图标;

3、

Name:取外键名称;

Traget table:父表名称;

Update ruleDelete rule:外键的更新和删除行为;

3.1.

Columns:里,点击 +号图标添加外键所关联的两个字段名(点击 - 号图标删除),Form:子表的外键字段名;To:父表中子表外键所关联的字段名;最后,点击 ④Execute 就创建外键完成啦。

通过这两种方法的其中一种方法建立好外键关系后。

当我从子表(student:学生表)中去删除两张表数据的时候,可以删除成功:

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Student.ID = 7;


如下:在两张表中 ID 为 7 的数据都被删除了。

子表(student:学生表)

 父表(achievement:学生成绩表)

可当我从父表中去删除两张表数据的时候,就不可以删除成功勒:

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Achievement.ID = 6;

那是因为,在添加了外键之后,再删除/更新父表的数据时会产生约束行为,也就是删除/更新行为。

语法:

在外键约束的基础语法的基础上 + on update 删除/更新行为的语法 on delete 删除/更新行为的语法;

删除/更新行为有以下 5 种语法,简单介绍一下:

no action(创建了外键约束默认的删除/更新行为):不允许删除/更新父表的数据;

restrict:跟 no action 效果一样;

casrict:允许删除/更新父表的数据;

set null:允许删除/更新父表的数据,但会把外键字段的值变成 null(前提是该外键的字段是允许为 null 的,不能设置成 not null);

演示:删除父表 ID 为 7 的值。

提示:如果要修改外键默认的删除/更新行为(no action),最好先把之前的外键删除,再添加(不然会出现外键重复)。

语法:alter table 子表 drop foreign key 外键名称;

演示:

alter table student drop foreign key fk_student_ID;

1、先把默认的 no action 删除/更新行为改成 set null;

alter table student add constraint fk_student_ID foreign key(ID) references achievement(ID) on update set null on delete set null;

原先表数据:

父表(achievement:学生成绩表)

子表 (student:学生表)

2、删除父表 ID 为 7 的值;

delete from achievement where ID = 7;

删除后的表数据:

父表(achievement:学生成绩表)

子表 (student:学生表)

可以看到因为删除父表 ID 为 7 的值,所以子表 (student:学生表)中对应的外键也变成 null 了。

set default:允许删除/更新父表的数据,但会把外键字段的值变成 default 默认的值;(但是,InnoDB 引擎不支持,而 MySQL 数据库只有 InnoDB 引擎才允许使用外键,所以 set default 对 MySQL 数据库不起作用);

演示:

在图形化界面把 Update rule 和 Delete rule 外键的更新和删除行为改为 set default 就会报错;

使用 SQL 语句修改也报错了; 

2.2、解决方法

方法一(简单版):关闭外键约束

删除前表的数据:

子表(student:学生表)

父表(achievement:学生成绩表)

1、关闭数据库的外键约束;
set foreign_key_checks = 0;

2、再删除多张表的数据;

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Achievement.ID = 6;

3、删除完之后开启数据库的外键约束;
set foreign_key_checks = 1;

删除后表的数据:

子表(student:学生表)

父表(achievement:学生成绩表)

“珊迪” -1。

 

方法二(麻烦版):修改删除/更新行为

第一种:图形化界面

1、选择建立了外键的表(student:学生表),右键 Modify Table...

2、点击 ①Foreign Keys,点击 ②之前插入的外键约束

3、把 ①Update rule: ②Delete rule:的选项全都改成 cascode(允许删除/更新父表的数据),然后点击 ③Execute

4、删除两张表中 ID 为 5 的数据。

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Achievement.ID = 5;

删除前表的数据:

子表(student:学生表)

父表(achievement:学生成绩表)

删除后表的数据:

子表(student:学生表)

父表(achievement:学生成绩表)

“痞老板” -1。

第二种:图形化界面+SQL语句(哈哈,其实还不如第一种)

1、选择建立了外键的表(student:学生表),右键 Modify Table...

2、点击 ①Foreign Keys,点击 ②之前插入的外键约束,点击 ③“-” 号删除该外键;

3、使用 SQL 语句把默认的 no action 删除/更新行为改成 cascode;

alter table student add constraint fk_student_ID foreign key(ID) references achievement(ID) on update cascade on delete cascade;

4、删除两张表中 ID 为 4 的数据。

delete Student, Achievement from Student, Achievement where Student.ID = Achievement.ID and Achievement.ID = 4;

删除前表的数据:

子表(student:学生表)

父表(achievement:学生成绩表)

删除后表的数据:

子表(student:学生表)

 父表(achievement:学生成绩表)

“蟹老板” -1。我喜欢钱💰~

好了,删到最后,就只剩下了邻居三人组了,拜拜啦~

  

完。。。

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

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

相关文章

HOT100--(5)最长回文子串

点击查看题目详情 中心扩散法 思路: 遍历字符串,以每个字符为中心点向两边扩散,如果遇到不一样的就跳出循环。以此类推,最后截取最大回文串返回。 细节 字符个数不一定都是奇数。当个数是偶数的是时候,我们可以“忽…

学习红客技术必备,手把手教你成为“安防第一人”

互联网时代已悄悄来临,作为新时代的人们,我们日常生活、工作、学习方面都需要借助互联网来完成,这样,又产生一种新的问题,那就是网络安全的问题,有时我们拼命加班好不容易完成的东西,在一夜之间…

优化Linux系统性能的必杀技:调整进程优先级!学会使用nice命令,让你的系统飞一般的顺畅!

文章目录前言一. nice命令介绍1.1 nice的介绍1.2 cpu资源的调度1.3 nice是控制内核吗?二. 语法格式及常用选项三. 参考案例3.1 将ls命令的优先级调整为最高3.2 将 find 命令的优先级调整为最低3.3 如何查看nice值四. nice和renice的区别总结前言 大家好&#xff0c…

Zookeeper的安装

目录 Zookeeper的安装 1、环境准备 2、上传 3、解压文件到opt/zookeeper目下 4、安装完后进入zookeeper,找到conf目录 5、复制zoo_sample.cfg 6、编辑zoo.cfg 7、复制一份会话,进入zookeeper安装目录,创建一个文件夹zkdata&#xff0…

Linux·DMA 与零拷贝技术

DMA 与零拷贝技术注意事项:除了 Direct I/O,与磁盘相关的文件读写操作都有使用到 page cache 技术。1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时,可以等价为进行如下的系统调用:File.read(file, buf, len);…

NOC2021年测试卷3

1. 角色初始位置坐标是(0,0),执行下面程序后,角色会出现在什么位置上?( ) A. x坐标为10,y坐标为50B. x坐标为40,y坐标为50C. x坐标为50,y坐标为40D. x坐标为30,y坐标为502. 执行下面程序后,按一次→键,兔子会?() A. 向右移动10步B. 向左移动10步C. 向上移动…

入职外包三个月,我提桶跑路了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

基于龙芯+国产FPGA 的VPX以太网交换板设计(一)

“棱镜门”的曝光,暴露出我国的信息安全存在极大的安全隐患,作为信息传输 载体的网络设备,其国产化需求迫切,国产处理器、国产可编程逻辑器件、以太网交 换芯片等具有良好的应用前景,另一方面,宽带数据业务…

Java 对象深拷贝

需求 写一个java对象深拷贝工具,用以对象深拷贝。 分析 在 Java 中,变量间值的传递分为两种。对于 int,char,string,等基本数据类型进行值传递时,使用值传递。即原变量 a 的值与新变量 b 的值相等,且 a 与 b 拥有不同的内存地址…

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径(常…

win10搭建android monkeyrunner自动化测试环境

本文记录一下monkeyrunner环境搭建遇到的各种坑,以免以后再次踩坑。首先要提一下巨坑,务必要安装java 8(本文记录于2023.3),安装其他版本java,运行monneyrunner会有很多问题,见第七节。 一、安…

Threejs 教程1

threejs核心概念场景、照相机、对象、光、渲染器等1.1.场景Scene 场景是所有物体的容器,对应着显示生活中的三维世界,所有的可视化对象级相关的动作均发生在场景中。1.2.照相机Camera照相机是三维世界中的观察者,类似与眼睛。为了观察这个世界…

5款软件压力测试工具分享

一、什么是软件压力测试? 软件压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。软件压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行…

达梦: DmAPService可以手动开启,但是不能开机自启

在部署生产环境安全版数据库发现,DmAPService服务不能开机自启,这样会导致服务器重启后,部署的定时备份任务不能够成功备份数据。 为了在服务器重启后,不影响定时任务自动备份数据库,现将解决这个问题的办法总结如下&a…

《MySql学习》 MySQL的 加锁规则

MySQL加锁原则 两个原则 原则 1:加锁的基本单位是 next-key lock。next-key lock 是前开后闭区间(区间锁和行锁)。原则 2:查找过程中访问到的对象(索引)才会加锁。 两个优化 1.优化 1:索引上…

美团2面:如何保障 MySQL 和 Redis 数据一致性?这样答,让面试官爱到 死去活来

美团2面:如何保障 MySQL 和 Redis 的数据一致性? 说在前面 在尼恩的(50)读者社群中,经常遇到一个 非常、非常高频的一个面试题,但是很不好回答,类似如下: 如何保障 MySQL 和 Redis…

JavaSE学习进阶 day1_02 继承(面向对象第二大特性)

第三章 继承 (面向对象的第二大特性) 3.1 概述 3.1.1 引入 假如我们要定义如下类: 学生类,老师类和工人类,分析如下。 学生类 属性:姓名,年龄 行为:吃饭,睡觉 老师类 属性:姓名,年龄,薪水 行为:吃饭,睡觉,教书 班…

C++ List链表使用

1. list的介绍及使用1.1 list的介绍1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个…

百度飞桨PaddleSpeech的简单使用

PaddleSpeech 是基于飞桨 PaddlePaddle 的语音方向的开源模型库,用于语音和音频中的各种关键任务的开发,包含大量基于深度学习前沿和有影响力的模型,一些典型的应用示例如下:语音识别、语音翻译 (英译中)、语音合成、标点恢复等。…

《商用密码应用与安全性评估》第一章密码基础知识1.2密码评估基本原理

商用密码应用安全性评估(简称“密评”)的定义:在采用商用密码技术、产品和服务集成建设的网络与信息系统中,对其密码应用的合规性、正确性、有效性等进行评估 信息安全管理过程 相关标准 国际:ISO/IEC TR 13335 中国:GB/T …