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

PostgreSQL TRUNCATE TABLE命令的使用

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

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

一、TRUNCATE基本概念

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

對(duì)比TRUNCATEDELETE
速度極快(元數(shù)據(jù)操作)慢(逐行刪除 + 觸發(fā)器)
是否觸發(fā)觸發(fā)器默認(rèn)不觸發(fā)觸發(fā)
是否記錄 WAL少量每行記錄
是否可回滾可(在事務(wù)中)
是否支持 WHERE不支持支持
是否釋放空間可選需 VACUUM

二、基本語(yǔ)法

TRUNCATE [TABLE] [ONLY] table_name [, ...]
    [RESTART IDENTITY | CONTINUE IDENTITY]
    [CASCADE | RESTRICT];

三、選項(xiàng)詳解

選項(xiàng)說(shuō)明示例
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自動(dòng)截?cái)啾煌怄I引用的表TRUNCATE orders CASCADE;
RESTRICT默認(rèn),若被引用則拒絕TRUNCATE orders RESTRICT;

四、完整示例

1. 基礎(chǔ)截?cái)?/h3>
TRUNCATE TABLE logs;

2. 截?cái)喽鄠€(gè)表(原子操作)

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 開(kāi)始
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. 級(jí)聯(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 會(huì)失?。≧ESTRICT 默認(rèn))
-- TRUNCATE users;  -- ERROR

-- 使用 CASCADE 自動(dòng)截?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ù)遷移、測(cè)試環(huán)境清理。

七、性能對(duì)比(實(shí)測(cè))

表行數(shù)DELETETRUNCATE加速比
100萬(wàn)~8.2 秒~0.012 秒680x
1000萬(wàn)~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的選擇指南

場(chǎng)景推薦命令
清空整個(gè)表TRUNCATE
保留部分?jǐn)?shù)據(jù)DELETE WHERE ...
需要觸發(fā)器DELETE
需要記錄審計(jì)DELETE + 觸發(fā)器
生產(chǎn)環(huán)境快速清理TRUNCATE ... CASCADE
測(cè)試數(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. 重置測(cè)試數(shù)據(jù)庫(kù)

-- 重置所有表 + 序列
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 $$;

十一、常見(jiàn)錯(cuò)誤與避坑

錯(cuò)誤原因解決
cannot truncate table because it is being referenced外鍵引用用 CASCADE
permission denied for table無(wú) TRUNCATE 權(quán)限GRANT TRUNCATE
sequence not restarted用了 CONTINUE IDENTITY加 RESTART IDENTITY
TRUNCATE with partitions分區(qū)表語(yǔ)法錯(cuò)誤用 TRUNCATE parent_table

十二、分區(qū)表截?cái)啵≒ostgreSQL 10+)

CREATE TABLE measurement (
    city_id INT,
    logdate DATE,
    temp NUMERIC
) PARTITION BY RANGE (logdate);

-- 截?cái)嗾麄€(gè)分區(qū)表
TRUNCATE measurement;

-- 僅截?cái)嗄硞€(gè)分區(qū)
TRUNCATE measurement_y2025m01;

十三、查看截?cái)鄽v史(通過(guò)日志)

-- 啟用日志
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)?+ 級(jí)聯(lián)相關(guān)表
TRUNCATE t1, t2;原子截?cái)喽鄠€(gè)表
TRUNCATE ONLY t;不包含子表
TRUNCATE t *;包含所有子表

十五、總結(jié)對(duì)比圖

DELETE FROM table;     → 慢,觸發(fā)器,WAL 多
TRUNCATE TABLE table;  → 快,無(wú)觸發(fā)器,WAL 少

黃金法則:能用 TRUNCATE 就別用 DELETE 清空表

到此這篇關(guān)于PostgreSQL TRUNCATE TABLE命令的使用的文章就介紹到這了,更多相關(guān)PostgreSQL TRUNCATE TABLE內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

开封县| 沾化县| 阿拉善左旗| 迁西县| 紫金县| 二手房| 金湖县| 田东县| 刚察县| 卢龙县| 板桥市| 贵德县| 通海县| 浦县| 普格县| 彭山县| 台山市| 开封县| 秦皇岛市| 新河县| 成安县| 老河口市| 平乐县| 岳阳市| 丰台区| 桂平市| 莫力| 巧家县| 肇源县| 县级市| 淮阳县| 汉源县| 永泰县| 肇庆市| 仲巴县| 盐山县| 昭觉县| 合阳县| 丽水市| 凤翔县| 都兰县|