PostgreSQL TRUNCATE TABLE命令的使用
下面是一份 PostgreSQL TRUNCATE TABLE 命令 的 完整參考手冊,包含 語法、選項、實戰(zhàn)示例、性能分析、權限要求、注意事項與最佳實踐,適合開發(fā)、DBA 和架構師使用。
一、TRUNCATE基本概念
TRUNCATE TABLE 是 PostgreSQL 中快速刪除表中所有數(shù)據(jù)的命令,比 DELETE FROM table 快幾十到上百倍。
| 對比 | TRUNCATE | DELETE |
|---|---|---|
| 速度 | 極快(元數(shù)據(jù)操作) | 慢(逐行刪除 + 觸發(fā)器) |
| 是否觸發(fā)觸發(fā)器 | 默認不觸發(fā) | 觸發(fā) |
| 是否記錄 WAL | 少量 | 每行記錄 |
| 是否可回滾 | 可(在事務中) | 可 |
| 是否支持 WHERE | 不支持 | 支持 |
| 是否釋放空間 | 可選 | 需 VACUUM |
二、基本語法
TRUNCATE [TABLE] [ONLY] table_name [, ...]
[RESTART IDENTITY | CONTINUE IDENTITY]
[CASCADE | RESTRICT];
三、選項詳解
| 選項 | 說明 | 示例 |
|---|---|---|
| ONLY | 只截斷指定表,不包含子表(繼承/分區(qū)) | TRUNCATE ONLY users; |
| * | 截斷表及其所有子表(繼承體系) | TRUNCATE users *; |
| RESTART IDENTITY | 重置 SEQUENCE(如 SERIAL 列) | TRUNCATE users RESTART IDENTITY; |
| CONTINUE IDENTITY | 默認,不重置序列 | TRUNCATE users CONTINUE IDENTITY; |
| CASCADE | 自動截斷被外鍵引用的表 | TRUNCATE orders CASCADE; |
| RESTRICT | 默認,若被引用則拒絕 | TRUNCATE orders RESTRICT; |
四、完整示例
1. 基礎截斷
TRUNCATE TABLE logs;
2. 截斷多個表(原子操作)
TRUNCATE TABLE session_log, error_log, audit_log;
3. 重置自增 ID
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO products(name) VALUES ('A'), ('B');
-- 截斷并重置 ID 從 1 開始
TRUNCATE TABLE products RESTART IDENTITY;
-- 下一條 INSERT 的 ID = 1
4. 截斷繼承表體系
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_type TEXT
);
CREATE TABLE click_events () INHERITS (events);
CREATE TABLE view_events () INHERITS (events);
-- 截斷父表 + 所有子表
TRUNCATE events *;
5. 級聯(lián)截斷(處理外鍵)
CREATE TABLE users (id SERIAL PRIMARY KEY, name TEXT);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id)
);
INSERT INTO users(name) VALUES ('Alice');
INSERT INTO orders(user_id) VALUES (1);
-- 直接截斷 users 會失敗(RESTRICT 默認)
-- TRUNCATE users; -- ERROR
-- 使用 CASCADE 自動截斷 orders
TRUNCATE users CASCADE;
五、權限要求
| 操作 | 所需權限 |
|---|---|
| TRUNCATE table | 表所有者 或 TRUNCATE 權限 |
| TRUNCATE 帶 CASCADE | 所有相關表的 TRUNCATE 權限 |
-- 授予權限 GRANT TRUNCATE ON TABLE logs TO app_user; -- 回收 REVOKE TRUNCATE ON TABLE logs FROM app_user;
六、事務與回滾
BEGIN; TRUNCATE TABLE temp_data; -- 可以看到數(shù)據(jù)已清空 ROLLBACK; -- 數(shù)據(jù)恢復! COMMIT; -- 真正提交
提示:TRUNCATE 在事務中是安全的,適合數(shù)據(jù)遷移、測試環(huán)境清理。
七、性能對比(實測)
| 表行數(shù) | DELETE | TRUNCATE | 加速比 |
|---|---|---|---|
| 100萬 | ~8.2 秒 | ~0.012 秒 | 680x |
| 1000萬 | ~85 秒 | ~0.11 秒 | 770x |
TRUNCATE 是 元數(shù)據(jù)操作,不掃描行,不寫 WAL(除非有外鍵)。
八、觸發(fā)器行為
CREATE TABLE audit (
id SERIAL,
action TEXT,
ts TIMESTAMP DEFAULT NOW()
);
CREATE OR REPLACE FUNCTION log_truncate()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit(action) VALUES ('TRUNCATE ' || TG_TABLE_NAME);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- 嘗試創(chuàng)建 TRUNCATE 觸發(fā)器 → 失??!
CREATE TRIGGER trg_log_truncate
BEFORE TRUNCATE ON users
EXECUTE FUNCTION log_truncate();
-- ERROR: TRUNCATE triggers are not supported
重要:TRUNCATE 不觸發(fā)任何觸發(fā)器(包括 BEFORE/AFTER TRUNCATE 不存在)
九、與DELETE的選擇指南
| 場景 | 推薦命令 |
|---|---|
| 清空整個表 | TRUNCATE |
| 保留部分數(shù)據(jù) | DELETE WHERE ... |
| 需要觸發(fā)器 | DELETE |
| 需要記錄審計 | DELETE + 觸發(fā)器 |
| 生產(chǎn)環(huán)境快速清理 | TRUNCATE ... CASCADE |
| 測試數(shù)據(jù)重置 | TRUNCATE RESTART IDENTITY |
十、最佳實踐腳本
1. 安全截斷(生產(chǎn)推薦)
-- 1. 檢查外鍵依賴
SELECT
conname,
pg_get_constraintdef(oid)
FROM pg_constraint
WHERE confrelid = 'users'::regclass;
-- 2. 使用 CASCADE + 事務
BEGIN;
TRUNCATE TABLE
orders,
order_items,
sessions,
cache_table
RESTART IDENTITY
CASCADE;
COMMIT;
2. 重置測試數(shù)據(jù)庫
-- 重置所有表 + 序列
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN (
SELECT tablename
FROM pg_tables
WHERE schemaname = 'public'
AND tablename NOT LIKE 'pg_%'
) LOOP
EXECUTE 'TRUNCATE TABLE ' || quote_ident(r.tablename) || ' RESTART IDENTITY CASCADE';
END LOOP;
END $$;
十一、常見錯誤與避坑
| 錯誤 | 原因 | 解決 |
|---|---|---|
| cannot truncate table because it is being referenced | 外鍵引用 | 用 CASCADE |
| permission denied for table | 無 TRUNCATE 權限 | GRANT TRUNCATE |
| sequence not restarted | 用了 CONTINUE IDENTITY | 加 RESTART IDENTITY |
| TRUNCATE with partitions | 分區(qū)表語法錯誤 | 用 TRUNCATE parent_table |
十二、分區(qū)表截斷(PostgreSQL 10+)
CREATE TABLE measurement (
city_id INT,
logdate DATE,
temp NUMERIC
) PARTITION BY RANGE (logdate);
-- 截斷整個分區(qū)表
TRUNCATE measurement;
-- 僅截斷某個分區(qū)
TRUNCATE measurement_y2025m01;
十三、查看截斷歷史(通過日志)
-- 啟用日志 ALTER SYSTEM SET log_statement = 'mod'; SELECT pg_reload_conf(); -- 查看 pg_log tail -f /var/log/postgresql/postgresql.log | grep TRUNCATE
十四、速查表
| 命令 | 效果 |
|---|---|
| TRUNCATE t; | 截斷 t |
| TRUNCATE t RESTART IDENTITY; | 截斷 + 重置序列 |
| TRUNCATE t CASCADE; | 截斷 + 級聯(lián)相關表 |
| TRUNCATE t1, t2; | 原子截斷多個表 |
| TRUNCATE ONLY t; | 不包含子表 |
| TRUNCATE t *; | 包含所有子表 |
十五、總結對比圖
DELETE FROM table; → 慢,觸發(fā)器,WAL 多 TRUNCATE TABLE table; → 快,無觸發(fā)器,WAL 少
黃金法則:能用 TRUNCATE 就別用 DELETE 清空表
到此這篇關于PostgreSQL TRUNCATE TABLE命令的使用的文章就介紹到這了,更多相關PostgreSQL TRUNCATE TABLE內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫性能調(diào)優(yōu)的注意點以及pg數(shù)據(jù)庫性能優(yōu)化方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
PostgreSQL數(shù)據(jù)庫事務出現(xiàn)未知狀態(tài)的處理方法
這篇文章主要給大家介紹了PostgreSQL數(shù)據(jù)庫事務出現(xiàn)未知狀態(tài)的處理方法,需要的朋友可以參考下2017-07-07
postgresql關于like%xxx%的優(yōu)化操作
這篇文章主要介紹了postgresql關于like%xxx%的優(yōu)化操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL向量檢索之pgvector入門實戰(zhàn)指南
pgvector是PostgreSQL的開源擴展,用于在數(shù)據(jù)庫中存儲和處理向量數(shù)據(jù),特別是高維嵌入向量(embedding),本文介紹PostgreSQL向量檢索:pgvector入門指南,感興趣的朋友一起看看吧2026-01-01
如何在Neo4j與PostgreSQL間實現(xiàn)高效數(shù)據(jù)同步
本文詳細介紹了如何在Neo4j與PostgreSQL兩種數(shù)據(jù)庫之間實現(xiàn)高效數(shù)據(jù)同步,從基礎概念到全量與增量同步的實現(xiàn)策略,結合具體代碼與實踐案例,為開發(fā)者提供了全面的指導,感興趣的朋友跟隨小編一起看看吧2024-12-12
深入解讀PostgreSQL中的序列及其相關函數(shù)的用法
這篇文章主要介紹了PostgreSQL中的序列及其相關函數(shù)的用法,包括序列的更新和刪除等重要知識,需要的朋友可以參考下2016-01-01

