最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PostgreSQL TRUNCATE TABLE命令的使用

 更新時間:2025年11月06日 09:41:25   作者:AI老李  
PostgreSQL的TRUNCATE TABLE命令是一種高效刪除表中所有數(shù)據(jù)的方法,相比DELETE快數(shù)十到數(shù)百倍,本文就來詳細的介紹一下該命令的使用,感興趣的可以了解一下

下面是一份 PostgreSQL TRUNCATE TABLE 命令 的 完整參考手冊,包含 語法、選項、實戰(zhàn)示例、性能分析、權限要求、注意事項與最佳實踐,適合開發(fā)、DBA 和架構師使用。

一、TRUNCATE基本概念

TRUNCATE TABLE 是 PostgreSQL 中快速刪除表中所有數(shù)據(jù)的命令,比 DELETE FROM table 快幾十到上百倍。

對比TRUNCATEDELETE
速度極快(元數(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ù)DELETETRUNCATE加速比
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ù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

延津县| 忻州市| 泰顺县| 巴彦淖尔市| 曲阜市| 平塘县| 岗巴县| 黔西县| 洛扎县| 普兰县| 阳东县| 华宁县| 湘阴县| 五莲县| 鄂托克前旗| 龙海市| 旌德县| 蚌埠市| 海兴县| 涿鹿县| 吴堡县| 封丘县| 绥中县| 镇巴县| 城口县| 阿拉尔市| 穆棱市| 高邮市| 云林县| 日土县| 德安县| 和政县| 华容县| 颍上县| 抚顺市| 开阳县| 泰州市| 临潭县| 霍林郭勒市| 波密县| 偏关县|