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。
清空資料表 bigtable
和 fattable
TRUNCATE bigtable, fattable;
相同地,並且也重設任何相關的序列產生器。
TRUNCATE bigtable, fattable RESTART IDENTITY;
截斷表格 othertable
,並且透過外鍵約束串聯到任何參照 othertable
的表格。
TRUNCATE othertable CASCADE;
SQL:2008 標準包含一個 TRUNCATE
指令,語法為 TRUNCATE TABLE
。tablename
CONTINUE IDENTITY
/RESTART IDENTITY
子句也出現在該標準中,但含義略有不同但相關。此指令的一些並行行為由標準保留給實現定義,因此應考慮上述注意事項,並在必要時與其他實現進行比較。
如果您在文件中看到任何不正確、與您特定功能的使用經驗不符,或需要進一步說明的內容,請使用此表單來回報文件問題。