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
選項可用於自動包含所有依賴表 — 但使用此選項時請務必小心,否則您可能會丟失不打算丟失的資料!特別要注意的是,當要截斷的表是分割槽時,同級分割槽保持不變,但是會級聯到所有引用表及其所有分割槽,沒有任何區別。
TRUNCATE
不會觸發可能存在的表的 ON DELETE
觸發器。但它會觸發 ON TRUNCATE
觸發器。如果為任何表定義了 ON TRUNCATE
觸發器,則在執行任何截斷操作之前,所有 BEFORE TRUNCATE
觸發器都會被觸發,並且在執行完最後一個截斷操作並重置所有序列後,所有 AFTER TRUNCATE
觸發器都會被觸發。觸發器將按照表處理的順序觸發(首先是命令中列出的那些,然後是由於級聯而新增的那些)。
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
子句也出現在該標準中,但含義略有不同但相關。該命令的一些併發行為在標準中被留給實現定義,因此如果需要,應考慮上述注意事項並與其他實現進行比較。
如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 來報告文件問題。