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

不止是DELETE:MySQL多表关联删除的JOIN语法实战详解

MySQL 的 ​​DELETE​​ 语句用于从数据库表中删除记录。这是一项非常强大且危险的操作,因为一旦执行,数据通常无法恢复。理解其语法和安全实践至关重要。

以下是 MySQL 删除语句的详细指南。

一、 核心语法:DELETE

​DELETE​​ 语句用于删除表中的一行或多行记录。

基本语法

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM table_name
[WHERE condition]
[ORDER BY ...]
[LIMIT row_count];
  • DELETE FROM table_name​: 指定要从哪个表删除数据。
  • WHERE​: 极其重要! 指定哪些记录需要被删除。如果省略 WHERE​ 子句,将删除表中的所有记录!
  • ORDER BY​​: 与 ​​LIMIT​​ 配合使用,指定先按什么顺序排序,再删除。
  • LIMIT​: 限制要删除的记录数量。

二、 删除操作示例

假设我们有一个 ​​users​​ 表,结构如下:

id

username

email

status

1

alice

​​alice@example.com​

inactive

2

bob

​​bob@example.com​

active

3

charlie

​​charlie@example.com​

inactive

4

david

​​david@example.com​

active

  1. 删除特定的记录(带 WHERE 条件)

删除用户名为 'charlie' 的记录。

DELETE FROM users
WHERE username = 'charlie';

最佳实践:尽量使用唯一性强的条件(如主键 ​​id​​)来精准定位要删除的行,避免误删。

DELETE FROM users
WHERE id = 3;
  1. 删除所有记录(清空表)

删除 ​​users​​ 表中的所有数据。

DELETE FROM users;

警告:这条语句会清空整个表,但表结构(列、索引等)依然存在。执行前必须万分谨慎

  1. 使用 LIMIT 限制删除数量

删除最早注册的 1 个状态为 ​​inactive​​ 的用户。

DELETE FROM users
WHERE status = 'inactive'
ORDER BY id ASC -- 按ID升序(假设ID越小注册越早)
LIMIT 1;

三、 清空表:DELETE vs TRUNCATE

除了 ​​DELETE​​,MySQL 还提供了 ​​TRUNCATE TABLE​​ 语句来清空整个表。两者有重要区别:

特性

​DELETE​

​TRUNCATE TABLE​

本质

DML操作(数据操作语言)

DDL操作(数据定义语言)

速度

较慢。逐行删除,并在事务日志中记录每一行。

极快。直接释放存储表数据的数据页。

事务

支持。删除操作可以被 ​ROLLBACK

在大多数情况下(取决于存储引擎),无法回滚

自增列

不会重置自增计数器(AUTO_INCREMENT)。下次插入的ID会继续增长。

会重置自增计数器为初始值。下次插入的ID从 1 开始。

WHERE 条件

支持使用 ​​WHERE​​ 条件删除部分数据。

不支持任何条件,只能清空整个表。

如何选择?

  • 需要删除特定记录时,必须使用 ​​DELETE ... WHERE ...​​。
  • 需要快速清空整个表且不需要回滚时,使用 ​​TRUNCATE TABLE​​。
  • 需要清空整个表但可能需要回滚时,使用 ​​DELETE FROM table_name​​。

TRUNCATE 语法:

TRUNCATE [TABLE] table_name;
-- 示例
TRUNCATE TABLE users;

四、 多表删除 (DELETE with JOIN)

你可以使用 ​​JOIN​​ 语法基于另一个表的条件来删除本表的数据。这在处理有关联的表时非常有用。

语法 1 (使用 DELETE ... JOIN):

DELETE t1
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.foreign_key_id
WHERE t2.some_condition;

语法 2 (使用子查询):

DELETE FROM table1
WHERE id IN (SELECT foreign_key_id FROM table2 WHERE some_condition);

示例: 假设还有一个 ​​orders​​ 表,存储用户的订单。现在要删除所有从未下过订单的用户。

-- 方法 1: 使用 LEFT JOIN 找到不存在的关联
DELETE u
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.user_id IS NULL;-- 方法 2: 使用子查询
DELETE FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);

五、 安全注意事项与最佳实践

1.备份先行 (Backup First) 在执行任何删除操作,尤其是会影响大量数据的操作之前,务必进行数据备份。

使用 mysqldump 备份单表
mysqldump -u username -p database_name table_name > backup.sql

2.先 SELECT,后 DELETE 这是一个黄金法则。先用 SELECT 语句验证 WHERE 条件是否正确匹配到了你想要删除的数据。

-- 1. 先查询,确认要删除哪些数据
SELECT * FROM users WHERE status = 'inactive';-- 2. 确认结果无误后,将 SELECT * 替换为 DELETE
DELETE FROM users WHERE status = 'inactive';

3.使用事务 (Transaction) 对于重要的删除操作,最好在事务中执行。这样如果发生错误,你可以回滚整个操作。

START TRANSACTION; -- 开始事务DELETE FROM orders WHERE date < '2020-01-01';
DELETE FROM users WHERE status = 'expired';
-- 此时可以检查一下是否删对了
SELECT * FROM users WHERE ...;ROLLBACK; -- 如果发现删错了,回滚,所有删除操作取消
-- COMMIT; -- 如果确认无误,提交事务,使删除生效

4.权限控制 在生产数据库中,严格限制拥有 DELETE 权限的用户数量。永远不要给应用程序账户过高的权限。

另外搭配便捷的MYSQL备份工具,可定时备份、异地备份,MYSQL导出导入。可本地连接LINUX里的MYSQL,简单便捷。可以大大地提高工作效率喔。


文章转载自:

http://YE2XLCzz.wnkjb.cn
http://9YsCreBR.wnkjb.cn
http://HQlslfLj.wnkjb.cn
http://zr4Ymvd6.wnkjb.cn
http://tPfnwsxG.wnkjb.cn
http://XZWhOn44.wnkjb.cn
http://Q2kTqTFE.wnkjb.cn
http://ARvKPDN2.wnkjb.cn
http://hxGizk6V.wnkjb.cn
http://KVrCp9yU.wnkjb.cn
http://hk443S2g.wnkjb.cn
http://FvJsf9Il.wnkjb.cn
http://khwi9yuJ.wnkjb.cn
http://vflbF9nO.wnkjb.cn
http://dSX36khG.wnkjb.cn
http://MN5YEPIu.wnkjb.cn
http://7pdyO1gM.wnkjb.cn
http://gIcbIrbO.wnkjb.cn
http://UHAYicpU.wnkjb.cn
http://8tvygIgP.wnkjb.cn
http://gJCHB2RE.wnkjb.cn
http://H5rRdVEM.wnkjb.cn
http://hS2UuXaG.wnkjb.cn
http://fScgJ46K.wnkjb.cn
http://Q31qKYmt.wnkjb.cn
http://dAxflUrn.wnkjb.cn
http://a7HePk9H.wnkjb.cn
http://BExqKvw5.wnkjb.cn
http://LVUCiTM2.wnkjb.cn
http://h02wWsTo.wnkjb.cn
http://www.dtcms.com/a/375577.html

相关文章:

  • 动态控制rabbitmq中的消费者监听的启动和停止
  • C# 基于halcon的视觉工作流-章30-圆圆距离测量
  • Android Studio 构建项目时 Gradle 下载失败的解决方案
  • 【STM32项目开源】STM32单片机智能恒温箱控制系统
  • 苹果ios的系统app应用WebClip免签应用开源及方式原理
  • Java数据库连接JDBC完全解析
  • Node-RED 究竟是否适合工业场景?
  • zephyr开发环境搭建
  • OpenCV 实战:基于模板匹配的身份证号自动识别系统
  • java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
  • CMake工程指南
  • 单北斗GNSS该如何在变形监测中发挥最大效能?
  • 大数据毕业设计-基于大数据的高考志愿填报推荐系统(高分计算机毕业设计选题·定制开发·真正大数据)
  • 分布式锁redis
  • Java学习之——“IO流“的进阶流之转换流的学习
  • git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
  • 每日一算:分发糖果
  • 神经算子学习
  • AI大模型入门1.1-python基础字符串代码
  • Tlias管理系统(多表查询-内连接外连接)
  • win11家庭版配置远程桌面
  • 8. LangChain4j + 提示词工程详细说明
  • ChatGPT大模型训练指南:如何借助动态代理IP提高训练效率
  • 利用git进行版本控制
  • 深入理解synchronized:从使用到原理的进阶指南
  • 第八章 矩阵按键实验
  • 【CSS 3D 实战】从零实现旋转立方体:理解 3D 空间的核心原理
  • C++互斥锁使用详解与案例分析
  • Python+DRVT 从外部调用 Revit:批量创建柱
  • Matlab机器人工具箱6.2 导入stl模型——用urdf文件描述