一、前言
在 mysql 中,可以使用 delete、truncate 和 drop 语句来删除数据。这三者虽然都能达到删除数据的效果,但它们的作用范围、执行效率以及数据恢复能力存在差异。
本文将介绍:
delete、truncate和drop的用法和区别delete语句的高级用法- 删除操作的注意事项和最佳实践
二、mysql 中的三种删除方式
1.delete语句
delete 语句用于删除表中符合条件的数据行,不删除表本身。
基本语法:
delete from 表名 where 条件;
表名:要操作的表名称。where 条件:指定要删除的记录,省略则删除所有记录。- 不加
where会删除表中所有数据,但表结构仍然保留。
示例:
假设有以下表 users:
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');
删除指定行:
delete from users where name = 'bob';
✅ 结果:删除 name='bob' 的记录。
删除所有数据:
delete from users;
✅ 结果:清空表中数据,但表结构还在。
删除多行:
delete from users where age > 25;
✅ 结果:删除所有年龄大于 25 岁的用户。
2.truncate语句
truncate 语句用于清空表中的所有数据,但不会记录删除操作,效率比 delete 更高。
基本语法:
truncate table 表名;
- 作用:清空表中的数据,但保留表结构。
- 效率:比
delete快,且释放表空间。 - 自增 id 重置:
truncate会将auto_increment重置为 1。
示例:
truncate table users;
✅ 结果:
- 清空表数据。
id自动增长重置为 1。
3.drop语句
drop 语句用于删除表本身,不仅数据被删除,表结构也会消失。
基本语法:
drop table 表名;
- 作用:删除表及其数据,无法恢复。
- 效率:速度快,但不可恢复。
示例:
drop table users;
✅ 结果:
- 表
users被删除,数据和表结构都不存在。
三、delete高级用法
1. 使用delete删除多表数据(多表关联删除)
在多表关联查询时,可以使用 join 删除多个表中的数据。
基本语法:
delete 表别名 from 表1 as 别名1 join 表2 as 别名2 on 关联条件 where 条件;
示例:
假设有以下两张表:
orders(订单表)customers(客户表)
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相关的订单:
delete o from orders o join customers c on o.customer_id = c.customer_id where c.name = 'bob';
✅ 结果:
- 删除
bob相关的订单数据。
2. 使用limit限制删除条数
在删除大量数据时,可以使用 limit 限制删除的行数,防止误操作导致大量数据丢失。
基本语法:
delete from 表名 where 条件 limit n;
示例:
删除 users 表中的前两条记录:
delete from users order by id asc limit 2;
✅ 结果:
- 仅删除两条数据,防止误删大量数据。
3. 使用order by和limit
在删除数据时,可以通过 order by 和 limit 指定删除顺序和数量。
示例:
删除年龄最大的 2 个用户:
delete from users order by age desc limit 2;
✅ 结果:
- 删除年龄最大的两名用户。
四、delete与truncate的区别
| 对比项 | delete | truncate |
|---|---|---|
| 数据删除方式 | 按行删除 | 整表清空 |
| 是否记录日志 | 记录日志 | 不记录日志 |
| 自增 id 重置 | 不重置 | 重置为 1 |
| 删除速度 | 慢,逐行删除 | 快,清空整表 |
| 是否可回滚 | 可回滚(开启事务) | 不可回滚 |
| 触发器是否执行 | 会触发 | 不会触发 |
| 表空间释放 | 不释放 | 释放表空间 |
五、删除操作的注意事项
谨慎使用 delete 和 truncate
truncate无法回滚,清空数据前要三思。- 在执行删除前,最好使用
select确认数据范围。
使用事务防止误操作
- 在执行大批量删除时,使用事务以便回滚:
start transaction; delete from users where age > 30; rollback; -- 撤销操作 commit; -- 确认操作
备份数据
- 删除操作前,备份重要数据,以防误删。
六、总结
在 mysql 中,删除数据主要使用以下三种方式:
- ✅
delete:按条件删除数据,记录日志,可回滚。 - ✅
truncate:清空表数据,不记录日志,不可回滚。 - ✅
drop:删除表及数据,无法恢复。
高级用法:
- 使用
limit限制删除条数,防止误删大量数据。 - 多表关联删除,提高操作灵活性。
- 使用事务保护数据,防止误删不可恢复。
到此这篇关于mysql删除数据用法及区别的文章就介绍到这了,更多相关mysql删除数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论