Mysql中的Delete *** 作

Mysql中的Delete *** 作,第1张

delete *** 作一般用于删除数据表中的某一行,常见的语法如下:

如果我们不在这条语句后面添加where筛选条件,则视为删除数据表的所有行,这里我们只对这种简单的使用方式加以回顾,并不举例说明。

如果在特定的场景中,需要使用sql语句删除重复的行,那我们应该如何 *** 作呢。这里给出一个具体的例子,例如 Leetcode 196 删除重复的邮箱 中需要我们使用delete命令删除重复的电子邮箱。

首先,需要使用自连接语句筛选出重复的电子邮箱id。

此时,我们将重复的电子邮箱查询出来。

然后,就需要使用delete语句,此时涉及到的是一个多表删除的语句,应该写成如下格式:

我们发现在delete和from之间加入了一个p1,这代表只删除p1表中满足筛选条件的行,而p1代表person,最终就完成了对person表的delete *** 作。

首先,我们仍然需要筛选出重复的电子邮箱的id。

然后,在person删除对应上述的id。

有一个计费表jifei,其中包含的字段有:phone(8位电话号码)、month(月份)、expense(月消费,费用为0表明该月没有产生费用),请你删除jifei表中所有10月份出现的两条相同记录的其中一条记录。

此题目中需要多个字段重复即删除,所以第一步仍然需要筛选出需要删除的行。

然后使用delete删除重复的行。

​ 上述两个步骤实际上删除的所有重复出现的行,但是题目需要删除10月份重复出现两次的记录,所以还需要内联结一个对月份记录的字段。

这里以 teacher 表为例,删除一条指定 id=8 的数据,命令如下:

执行结果如下图:

以 teacher 表为例,删除多条数据命令如下:

执行结果如下图:

清空表数据命令 :

执行结果如下图:

本小节介绍了如何删除指定 id 的数据、数据表所有数据,需要注意的是使用 TRUNCATE 清空表所有数据,和使用 DELETE 删除表所有的数据的区别是:

测试小伙伴不小心执行了 DELETE * FROM 表名 语句,删除了测试服十几万条数据。因为测试还需要这些数据,所以只能进行恢复

1.找到mysql的日志文件binlog(二进制)

2.筛选出执行的DELETE语句,并重定向到文件中方便查看

当执行 DELETE * FROM 表名 语句时,实际上是对表内的数据一条条执行 DELETE FROM XXX WHERE XXXXXX 。而因为binlog文件很大(基本几百M起步),所以需要根据执行 DELETE * FROM xxx 语句的大概时间,进行筛选。语句: mysqlbinlog -vv --start-datetime='2020-06-10 10:10:00' binlog文件名 >重定向文件名1

3.再根据重定向文件1中的内容再次筛选,比如我想要 DELETE FROM `xxxx`.`t_channel 这一行以及下面13行的内容。所以我会再次进行筛选并重定向生成新的文件: cat 重定向文件名1 -C 13 `DELETE FROM `xxxx`.`t_channel` >重定向文件名2 ,这样我会得到一个只包含 DELETE FROM XXX WHERE XXXXXX 语句的文件。

PS.

参考: https://blog.csdn.net/weixin_33811961/article/details/89593855


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8678017.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存