支援版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

TRUNCATE

TRUNCATE — 清空一個或一組資料表

概要

TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ]
    [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]

描述

TRUNCATE 可以快速地從一組資料表中移除所有列。它和在每個資料表上執行不帶條件的 DELETE 指令有相同的效果,但是因為它實際上不掃描資料表,所以速度更快。此外,它會立即回收磁碟空間,而不是需要後續的 VACUUM 操作。這在大型資料表上最有用。

參數

name

要清空的資料表的名稱(可以選擇性地帶有模式限定)。如果在資料表名稱之前指定 ONLY,則只會清空該資料表。如果沒有指定 ONLY,則會清空該資料表及其所有子資料表(如果有的話)。可以選擇在資料表名稱後指定 * 以明確指示包含子資料表。

RESTART IDENTITY

自動重新啟動被清空資料表欄位所擁有的序列。

CONTINUE IDENTITY

不改變序列的值。這是預設值。

CASCADE

自動清空所有具有外鍵參考到任何已命名資料表,或者因為 CASCADE 而被加入到該群組的資料表。

RESTRICT

如果任何資料表具有來自未在指令中列出的資料表的外鍵參考,則拒絕清空。這是預設值。

注意

你必須在一個資料表上具有 TRUNCATE 權限才能清空它。

TRUNCATE 在它操作的每個資料表上獲取一個 ACCESS EXCLUSIVE 鎖,這會阻止對該資料表的所有其他並發操作。當指定 RESTART IDENTITY 時,任何要重新啟動的序列也會被獨佔鎖定。如果需要並發存取資料表,則應改用 DELETE 指令。

TRUNCATE 不能用於有來自其他資料表的外鍵參考的資料表,除非所有這些資料表也在同一個指令中被清空。在這種情況下,檢查有效性需要掃描資料表,而其重點是不進行掃描。 CASCADE 選項可用於自動包含所有依賴的資料表 — 但是在使用此選項時要非常小心,否則你可能會遺失你不想遺失的資料!特別要注意的是,當要被清空的資料表是一個分割表時,兄弟分割表保持不變,但 cascading 會發生在所有引用資料表和它們所有的分割表,沒有區別。

TRUNCATE 不會觸發可能存在於資料表上的任何 ON DELETE 觸發器。但是它會觸發 ON TRUNCATE 觸發器。如果為任何資料表定義了 ON TRUNCATE 觸發器,則在任何清空發生之前,會觸發所有 BEFORE TRUNCATE 觸發器,並且在執行最後一次清空和重置任何序列之後,會觸發所有 AFTER TRUNCATE 觸發器。觸發器將按照資料表要被處理的順序觸發(首先是指令中列出的資料表,然後是由於 cascading 而添加的任何資料表)。

TRUNCATE 不是 MVCC 安全的。 清空後,如果並行交易使用在清空之前取得的快照,則該資料表對於這些交易會顯示為空的。有關更多詳細資訊,請參閱 第 13.6 節

TRUNCATE 對於資料表中的資料是交易安全的:如果周圍的交易沒有提交,則清空將安全地回滾。

當指定 RESTART IDENTITY 時,隱含的 ALTER SEQUENCE RESTART 操作也是以交易方式完成的;也就是說,如果周圍的交易沒有提交,它們將被回滾。請注意,如果在交易回滾之前,對重新啟動的序列執行任何額外的序列操作,則這些操作對序列的影響將被回滾,但它們對 currval() 的影響則不會;也就是說,在交易之後,currval() 將繼續反映在失敗的交易內部取得的最後一個序列值,即使序列本身可能不再與該值一致。這與失敗的交易之後 currval() 的通常行為相似。

如果外部資料封裝器支援,TRUNCATE 可用於外部資料表,例如,請參閱 postgres_fdw

範例

清空資料表 bigtablefattable

TRUNCATE bigtable, fattable;

相同地,並且也重設任何相關的序列產生器。

TRUNCATE bigtable, fattable RESTART IDENTITY;

截斷表格 othertable,並且透過外鍵約束串聯到任何參照 othertable 的表格。

TRUNCATE othertable CASCADE;

相容性

SQL:2008 標準包含一個 TRUNCATE 指令,語法為 TRUNCATE TABLE tablenameCONTINUE IDENTITY/RESTART IDENTITY 子句也出現在該標準中,但含義略有不同但相關。此指令的一些並行行為由標準保留給實現定義,因此應考慮上述注意事項,並在必要時與其他實現進行比較。

另請參閱

DELETE

提交更正

如果您在文件中看到任何不正確、與您特定功能的使用經驗不符,或需要進一步說明的內容,請使用此表單來回報文件問題。