PostgreSQL TRUNCATE TABLE命令的使用
下面是一份 PostgreSQL TRUNCATE TABLE 命令 的 完整參考手冊,包含 語法、選項(xiàng)、實(shí)戰(zhàn)示例、性能分析、權(quán)限要求、注意事項(xiàng)與最佳實(shí)踐,適合開發(fā)、DBA 和架構(gòu)師使用。
一、TRUNCATE基本概念
TRUNCATE TABLE 是 PostgreSQL 中快速刪除表中所有數(shù)據(jù)的命令,比 DELETE FROM table 快幾十到上百倍。
| 對比 | TRUNCATE | DELETE |
|---|---|---|
| 速度 | 極快(元數(shù)據(jù)操作) | 慢(逐行刪除 + 觸發(fā)器) |
| 是否觸發(fā)觸發(fā)器 | 默認(rèn)不觸發(fā) | 觸發(fā) |
| 是否記錄 WAL | 少量 | 每行記錄 |
| 是否可回滾 | 可(在事務(wù)中) | 可 |
| 是否支持 WHERE | 不支持 | 支持 |
| 是否釋放空間 | 可選 | 需 VACUUM |
二、基本語法
TRUNCATE [TABLE] [ONLY] table_name [, ...]
[RESTART IDENTITY | CONTINUE IDENTITY]
[CASCADE | RESTRICT];
三、選項(xiàng)詳解
| 選項(xiàng) | 說明 | 示例 |
|---|---|---|
| ONLY | 只截?cái)嘀付ū?,不包含子表(繼承/分區(qū)) | TRUNCATE ONLY users; |
| * | 截?cái)啾砑捌渌凶颖恚ɡ^承體系) | TRUNCATE users *; |
| RESTART IDENTITY | 重置 SEQUENCE(如 SERIAL 列) | TRUNCATE users RESTART IDENTITY; |
| CONTINUE IDENTITY | 默認(rèn),不重置序列 | TRUNCATE users CONTINUE IDENTITY; |
| CASCADE | 自動截?cái)啾煌怄I引用的表 | TRUNCATE orders CASCADE; |
| RESTRICT | 默認(rèn),若被引用則拒絕 | TRUNCATE orders RESTRICT; |
四、完整示例
1. 基礎(chǔ)截?cái)?/h3>
TRUNCATE TABLE logs;
TRUNCATE TABLE logs;
2. 截?cái)喽鄠€表(原子操作)
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');
-- 截?cái)嗖⒅刂?ID 從 1 開始
TRUNCATE TABLE products RESTART IDENTITY;
-- 下一條 INSERT 的 ID = 1
4. 截?cái)嗬^承表體系
CREATE TABLE events (
id SERIAL PRIMARY KEY,
event_type TEXT
);
CREATE TABLE click_events () INHERITS (events);
CREATE TABLE view_events () INHERITS (events);
-- 截?cái)喔副?+ 所有子表
TRUNCATE events *;
5. 級聯(lián)截?cái)啵ㄌ幚硗怄I)
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);
-- 直接截?cái)?users 會失?。≧ESTRICT 默認(rèn))
-- TRUNCATE users; -- ERROR
-- 使用 CASCADE 自動截?cái)?orders
TRUNCATE users CASCADE;
五、權(quán)限要求
| 操作 | 所需權(quán)限 |
|---|---|
| TRUNCATE table | 表所有者 或 TRUNCATE 權(quán)限 |
| TRUNCATE 帶 CASCADE | 所有相關(guān)表的 TRUNCATE 權(quán)限 |
-- 授予權(quán)限 GRANT TRUNCATE ON TABLE logs TO app_user; -- 回收 REVOKE TRUNCATE ON TABLE logs FROM app_user;
六、事務(wù)與回滾
BEGIN; TRUNCATE TABLE temp_data; -- 可以看到數(shù)據(jù)已清空 ROLLBACK; -- 數(shù)據(jù)恢復(fù)! COMMIT; -- 真正提交
提示:TRUNCATE 在事務(wù)中是安全的,適合數(shù)據(jù)遷移、測試環(huán)境清理。
七、性能對比(實(shí)測)
| 表行數(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 |
| 保留部分?jǐn)?shù)據(jù) | DELETE WHERE ... |
| 需要觸發(fā)器 | DELETE |
| 需要記錄審計(jì) | DELETE + 觸發(fā)器 |
| 生產(chǎn)環(huán)境快速清理 | TRUNCATE ... CASCADE |
| 測試數(shù)據(jù)重置 | TRUNCATE RESTART IDENTITY |
十、最佳實(shí)踐腳本
1. 安全截?cái)啵ㄉa(chǎn)推薦)
-- 1. 檢查外鍵依賴
SELECT
conname,
pg_get_constraintdef(oid)
FROM pg_constraint
WHERE confrelid = 'users'::regclass;
-- 2. 使用 CASCADE + 事務(wù)
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 權(quán)限 | GRANT TRUNCATE |
| sequence not restarted | 用了 CONTINUE IDENTITY | 加 RESTART IDENTITY |
| TRUNCATE with partitions | 分區(qū)表語法錯誤 | 用 TRUNCATE parent_table |
十二、分區(qū)表截?cái)啵≒ostgreSQL 10+)
CREATE TABLE measurement (
city_id INT,
logdate DATE,
temp NUMERIC
) PARTITION BY RANGE (logdate);
-- 截?cái)嗾麄€分區(qū)表
TRUNCATE measurement;
-- 僅截?cái)嗄硞€分區(qū)
TRUNCATE measurement_y2025m01;
十三、查看截?cái)鄽v史(通過日志)
-- 啟用日志 ALTER SYSTEM SET log_statement = 'mod'; SELECT pg_reload_conf(); -- 查看 pg_log tail -f /var/log/postgresql/postgresql.log | grep TRUNCATE
十四、速查表
| 命令 | 效果 |
|---|---|
| TRUNCATE t; | 截?cái)?t |
| TRUNCATE t RESTART IDENTITY; | 截?cái)?+ 重置序列 |
| TRUNCATE t CASCADE; | 截?cái)?+ 級聯(lián)相關(guān)表 |
| TRUNCATE t1, t2; | 原子截?cái)喽鄠€表 |
| TRUNCATE ONLY t; | 不包含子表 |
| TRUNCATE t *; | 包含所有子表 |
十五、總結(jié)對比圖
DELETE FROM table; → 慢,觸發(fā)器,WAL 多 TRUNCATE TABLE table; → 快,無觸發(fā)器,WAL 少
黃金法則:能用 TRUNCATE 就別用 DELETE 清空表
到此這篇關(guān)于PostgreSQL TRUNCATE TABLE命令的使用的文章就介紹到這了,更多相關(guān)PostgreSQL TRUNCATE TABLE內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 15個postgresql數(shù)據(jù)庫實(shí)用命令分享
- 在postgresql中通過命令行執(zhí)行sql文件
- PostgreSQL copy 命令教程詳解
- postgresql 導(dǎo)出建表語句的命令操作
- PostgreSql新手必學(xué)入門命令小結(jié)
- PostgreSQL中的psql命令詳解
- PostgreSQL 修改表字段常用命令操作
- 查看postgresql系統(tǒng)信息的常用命令操作
- PostgreSQL數(shù)據(jù)庫命令行執(zhí)行SQL腳本的三種方式
- postgreSQL數(shù)據(jù)庫默認(rèn)用戶postgres常用命令分享
相關(guān)文章
Postgresql 檢查數(shù)據(jù)庫主從復(fù)制進(jìn)度的操作
這篇文章主要介紹了Postgresql 檢查數(shù)據(jù)庫主從復(fù)制進(jìn)度的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作
這篇文章主要介紹了postgreSQL 數(shù)字與字符串類型轉(zhuǎn)換操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼
PostgreSQL 是一個免費(fèi)的對象-關(guān)系數(shù)據(jù)庫服務(wù)器(ORDBMS),在靈活的BSD許可證下發(fā)行。這篇文章主要介紹了Mac系統(tǒng)重置PostgreSQL密碼的方法示例代碼,需要的朋友可以參考下2020-02-02
PostgreSQL數(shù)據(jù)庫中Sequence的使用方法詳解
在 PostgreSQL 數(shù)據(jù)庫中,Sequence 是一種特殊的表對象,主要用于生成按順序遞增或遞減的數(shù)字序列,通常用于需要唯一標(biāo)識符的場景,例如自增 ID,以下是如何在 PostgreSQL 中使用 Sequence 的詳細(xì)步驟,需要的朋友可以參考下2024-11-11
PostgreSQL 實(shí)現(xiàn)子查詢返回多行的案例
這篇文章主要介紹了PostgreSQL 實(shí)現(xiàn)子查詢返回多行的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
PostgreSQL的upsert實(shí)例操作(insert on conflict do)
這篇文章主要介紹了PostgreSQL的upsert實(shí)例操作(insert on conflict do),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01

