删除表
SQL 提供三种删表方式,破坏性从高到低逐级递减:DROP、TRUNCATE、DELETE。
最彻底的是 DROP TABLE——表结构和数据一块儿永久消失,磁盘空间释放,就像这栋楼从来没盖过一样。然后是 TRUNCATE TABLE——数据清空但楼还在,表结构(列定义、索引、约束)全部保留,就像一个空的模板等着重新填数据。最后是 DELETE FROM——按条件逐行删除,保留表结构,你可以指定 WHERE 条件删某几行而不是全清,而且能回滚。
三者的速度差别也很大。TRUNCATE 比 DELETE 快得多,因为它不逐行记录日志、不触发行级触发器,而是直接释放数据页。但代价是大多数数据库不允许 TRUNCATE 回滚。如果不确定会不会后悔,先用 DELETE。
标准写法:
-- 永久删除整个表
DROP TABLE 表名;
DROP TABLE IF EXISTS 表名; -- 更安全
-- 清空数据,保留结构
TRUNCATE TABLE 表名;
-- 按条件删数据
DELETE FROM 表名 WHERE 条件;
以飞翔科技为例:
-- 临时报表已导出,安全删除临时表
DROP TABLE IF EXISTS temp_salary_report;
-- 商品日志表太臃肿,清空数据保留表结构继续使用
TRUNCATE TABLE product_logs;
-- 删除 2018 年以前的旧订单
DELETE FROM orders
WHERE order_year < 2018;
三种操作对应三种场景:临时表用完就 DROP,流水表定期 TRUNCATE,历史数据有选择地 DELETE。关键原则就一条:动手前想清楚这操作能不能后悔,不能后悔的先备份。