闽公网安备 35020302035485号
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 的折中选择。