DELETE FROM table_name WHERE condition;示例
-- 删除 employees 表中 department_id 为 10 的所有员工 DELETE FROM employees WHERE department_id = 10; -- 堆代码 duidaima.com -- 删除 employees 表中的所有行 DELETE FROM employees;特点
.删除速度相对较慢,特别是在大表中。
-- 删除 employees 表 DROP TABLE employees; -- 删除 employees 表(如果存在) DROP TABLE IF EXISTS employees;特点
.不会激活触发器。
TRUNCATE TABLE table_name;示例
-- 删除 employees 表中的所有数据 TRUNCATE TABLE employees;特点
.重置自增列(如果存在)。
特性 | DELETE | DROP | TRUNCATE |
---|---|---|---|
操作对象 | 表中的行 | 整个表 | 表中的所有行 |
条件删除 | 支持 | 不支持 | 不支持 |
保留表结构 | 是 | 否 | 是 |
速度 | 最慢 | 最快 | 介于两者之间 |
事务日志 | 记录每行 | 仅记录操作 | 仅记录操作 |
触发器 | 激活 | 不激活 | 不激活 |
回滚 | 可以 | 不可以 | 取决于数据库 |
重置自增列 | 否 | N/A | 是 |
DELETE:逐行删除,速度最慢,特别是在大表中。 TRUNCATE:通过释放存储表数据所用的数据页来删除数据,速度快。 DROP:直接删除表的结构,速度最快。 -- 性能测试示例(以 MySQL 为例) -- 创建测试表 CREATE TABLE test_table ( id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(100) ); -- 插入 100 万条测试数据 INSERT INTO test_table (data) SELECT CONCAT('Data ', FLOOR(RAND() * 1000000)) FROM information_schema.columns; -- 堆代码 duidaima.com -- 测试 DELETE START TRANSACTION; DELETE FROM test_table; -- 记录执行时间 ROLLBACK; -- 测试 TRUNCATE TRUNCATE TABLE test_table; -- 测试 DROP(需要重新创建表) DROP TABLE test_table;事务和回滚
-- DELETE 的回滚示例 START TRANSACTION; DELETE FROM employees WHERE department_id = 10; ROLLBACK; -- TRUNCATE 在某些数据库中的回滚(以 SQL Server 为例) BEGIN TRANSACTION; TRUNCATE TABLE employees; ROLLBACK;自增列的影响
-- 测试自增列行为 CREATE TABLE test_auto ( id INT AUTO_INCREMENT PRIMARY KEY, data VARCHAR(100) ); INSERT INTO test_auto (data) VALUES ('A'), ('B'), ('C'); -- 删除部分数据 DELETE FROM test_auto WHERE id > 1; -- 插入新数据,id 将从 4 开始 INSERT INTO test_auto (data) VALUES ('D'); -- TRUNCATE 后 TRUNCATE TABLE test_auto; -- 插入新数据,id 将从 1 开始 INSERT INTO test_auto (data) VALUES ('E');权限要求
-- 授权示例(以 MySQL 为例) GRANT DELETE ON database_name.table_name TO 'user'@'localhost'; GRANT DROP ON database_name.table_name TO 'user'@'localhost';最佳实践
确定不需要保留任何相关的对象(如触发器、索引等)
考虑在执行重要操作前进行数据备份。
.TRUNCATE 用于快速删除表中所有数据,同时保留表结构,是 DELETE 和 DROP 的折中选择。