24、delete 删除表数据

1、delete 子句

从表中删除数据,执行一个“删除所有行”的 DML 操作。

过程:

  • 逐行扫描并删除
  • 每一行删除都写入事务日志(用于回滚和恢复)
  • 触发 DELETE 触发器(如果有)

语法:

delete  from 表名  where 条件         -- 删除特定的行
delete  from 表名                     -- 删除所有的行

注:delete 只删除表中数据,不删除表。

-- 功能:从表中删除记录
-- 节点解析:
-- DELETE FROM - 指定要删除数据的表
-- WHERE - 删除条件(重要!避免误删全部数据)
DELETE FROM employees 
WHERE termination_date IS NOT NULL   -- 只删除已离职员工
AND termination_date < '2022-01-01'; -- 且离职时间早于2022年

-- 分批次删除大数据量(避免锁表)
DELETE FROM large_table 
WHERE condition = true
LIMIT 1000;  -- 每次只删除1000条

2、truncate 子句

通过释放存储表数据的数据页来清空表,属于 DDL 操作。

过程:

 

  • 不逐行删除,而是取消分配数据页
  • 仅记录页释放的日志(日志量极小)
  • 不触发触发器
  • 重置自增列(IDENTITY / AUTO_INCREMENT)为初始值

 语法:

truncate  table 表名;     -- 删除原来的表,并重新建立一张同名的表

 

特性DELETE FROM table_name;TRUNCATE TABLE table_name;
SQL 类型 DML(数据操作语言) DDL(数据定义语言)
是否可带 WHERE ✅ 可以(删除部分数据) ❌ 不可以(只能清空整表
逐行删除 ✅ 是(记录每行日志) ❌ 否(直接释放数据页)
事务回滚 ✅ 支持(在事务中可回滚) ⚠️ 多数数据库不支持回滚
触发器触发 ✅ 会触发 DELETE 触发器 ❌ 不会触发触发器
性能 慢(尤其大表) 极快(几乎瞬间完成)
锁机制 行锁或页锁 表锁(排他锁)
重置自增计数器 ❌ 不重置(MySQL 除外) ✅ 重置为初始值
外键约束影响 ✅ 受外键约束限制 ⚠️ 某些数据库禁止 truncate 被引用的表
所需权限 DELETE 权限 DDL 权限(如 ALTER

*注意:在 SQL Server 中,TRUNCATE 可以回滚,在 Oracle 中部分支持

posted @ 2025-11-20 09:24  chao_xiong  阅读(11)  评论(0)    收藏  举报