文章目录
- 一、前言
- [二、MySQL 中的三种删除方式](#二、MySQL 中的三种删除方式)
- [三、`DELETE` 高级用法](#三、
DELETE
高级用法) -
- [1. 使用 `DELETE` 删除多表数据(多表关联删除)](#1. 使用
DELETE
删除多表数据(多表关联删除)) -
- [✅ 基本语法:](#✅ 基本语法:)
- [🔥 示例:](#🔥 示例:)
-
- [删除与 `Bob` 相关的订单:](#删除与
Bob
相关的订单:)
- [删除与 `Bob` 相关的订单:](#删除与
- [2. 使用 `LIMIT` 限制删除条数](#2. 使用
LIMIT
限制删除条数) -
- [✅ 基本语法:](#✅ 基本语法:)
- [🔥 示例:](#🔥 示例:)
- [3. 使用 `ORDER BY` 和 `LIMIT`](#3. 使用
ORDER BY
和LIMIT
) -
- [🔥 示例:](#🔥 示例:)
- [1. 使用 `DELETE` 删除多表数据(多表关联删除)](#1. 使用
- [四、`DELETE` 与 `TRUNCATE` 的区别](#四、
DELETE
与TRUNCATE
的区别) - 五、删除操作的注意事项
- 六、总结
一、前言
在 MySQL 中,可以使用 DELETE
、TRUNCATE
和 DROP
语句来删除数据。这三者虽然都能达到删除数据的效果,但它们的作用范围、执行效率以及数据恢复能力存在差异。
本文将介绍:
DELETE
、TRUNCATE
和DROP
的用法和区别DELETE
语句的高级用法- 删除操作的注意事项和最佳实践
二、MySQL 中的三种删除方式
1. DELETE
语句
DELETE
语句用于删除表中符合条件的数据行,不删除表本身。
✅ 基本语法:
sql
DELETE FROM 表名 WHERE 条件;
表名
:要操作的表名称。WHERE 条件
:指定要删除的记录,省略则删除所有记录。- 不加
WHERE
会删除表中所有数据,但表结构仍然保留。
🔥 示例:
假设有以下表 users
:
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
-- 插入测试数据
INSERT INTO users (name, age, city) VALUES
('Alice', 25, 'Beijing'),
('Bob', 30, 'Shanghai'),
('Charlie', 35, 'Guangzhou');
删除指定行:
sql
DELETE FROM users WHERE name = 'Bob';
✅ 结果:删除 name='Bob'
的记录。
删除所有数据:
sql
DELETE FROM users;
✅ 结果:清空表中数据,但表结构还在。
删除多行:
sql
DELETE FROM users WHERE age > 25;
✅ 结果:删除所有年龄大于 25 岁的用户。
2. TRUNCATE
语句
TRUNCATE
语句用于清空表中的所有数据 ,但不会记录删除操作,效率比 DELETE
更高。
✅ 基本语法:
sql
TRUNCATE TABLE 表名;
- 作用:清空表中的数据,但保留表结构。
- 效率 :比
DELETE
快,且释放表空间。 - 自增 ID 重置 :
TRUNCATE
会将AUTO_INCREMENT
重置为 1。
🔥 示例:
sql
TRUNCATE TABLE users;
✅ 结果:
- 清空表数据。
id
自动增长重置为 1。
3. DROP
语句
DROP
语句用于删除表本身,不仅数据被删除,表结构也会消失。
✅ 基本语法:
sql
DROP TABLE 表名;
- 作用:删除表及其数据,无法恢复。
- 效率:速度快,但不可恢复。
🔥 示例:
sql
DROP TABLE users;
✅ 结果:
- 表
users
被删除,数据和表结构都不存在。
三、DELETE
高级用法
1. 使用 DELETE
删除多表数据(多表关联删除)
在多表关联查询时,可以使用 JOIN
删除多个表中的数据。
✅ 基本语法:
sql
DELETE 表别名 FROM 表1 AS 别名1
JOIN 表2 AS 别名2 ON 关联条件
WHERE 条件;
🔥 示例:
假设有以下两张表:
orders
(订单表)customers
(客户表)
sql
CREATE TABLE customers (
customer_id INT PRIMARY KEY,
name VARCHAR(50)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY,
customer_id INT,
amount DECIMAL(10,2),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
-- 插入数据
INSERT INTO customers VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie');
INSERT INTO orders VALUES (1, 1, 100.50), (2, 2, 200.75), (3, 3, 300.25);
删除与 Bob
相关的订单:
sql
DELETE o FROM orders o
JOIN customers c ON o.customer_id = c.customer_id
WHERE c.name = 'Bob';
✅ 结果:
- 删除
Bob
相关的订单数据。
2. 使用 LIMIT
限制删除条数
在删除大量数据时,可以使用 LIMIT
限制删除的行数,防止误操作导致大量数据丢失。
✅ 基本语法:
sql
DELETE FROM 表名 WHERE 条件 LIMIT N;
🔥 示例:
删除 users
表中的前两条记录:
sql
DELETE FROM users ORDER BY id ASC LIMIT 2;
✅ 结果:
- 仅删除两条数据,防止误删大量数据。
3. 使用 ORDER BY
和 LIMIT
在删除数据时,可以通过 ORDER BY
和 LIMIT
指定删除顺序和数量。
🔥 示例:
删除年龄最大的 2 个用户:
sql
DELETE FROM users
ORDER BY age DESC
LIMIT 2;
✅ 结果:
- 删除年龄最大的两名用户。
四、DELETE
与 TRUNCATE
的区别
对比项 | DELETE |
TRUNCATE |
---|---|---|
数据删除方式 | 按行删除 | 整表清空 |
是否记录日志 | 记录日志 | 不记录日志 |
自增 ID 重置 | 不重置 | 重置为 1 |
删除速度 | 慢,逐行删除 | 快,清空整表 |
是否可回滚 | 可回滚(开启事务) | 不可回滚 |
触发器是否执行 | 会触发 | 不会触发 |
表空间释放 | 不释放 | 释放表空间 |
五、删除操作的注意事项
-
谨慎使用
DELETE
和TRUNCATE
TRUNCATE
无法回滚,清空数据前要三思。- 在执行删除前,最好使用
SELECT
确认数据范围。
-
使用事务防止误操作
- 在执行大批量删除时,使用事务以便回滚:
sqlSTART TRANSACTION; DELETE FROM users WHERE age > 30; ROLLBACK; -- 撤销操作 COMMIT; -- 确认操作
-
备份数据
- 删除操作前,备份重要数据,以防误删。
六、总结
在 MySQL 中,删除数据主要使用以下三种方式:
- ✅
DELETE
:按条件删除数据,记录日志,可回滚。 - ✅
TRUNCATE
:清空表数据,不记录日志,不可回滚。 - ✅
DROP
:删除表及数据,无法恢复。
高级用法:
- 使用
LIMIT
限制删除条数,防止误删大量数据。 - 多表关联删除,提高操作灵活性。
- 使用事务保护数据,防止误删不可恢复。