PostgreSQL TRUNCATE

2021-09-13 15:05 更新

TRUNCATE — 清空一個表或者一組表

大綱

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

描述

TRUNCATE可以從一組表中快速地移除所有行。 它具有和在每個表上執(zhí)行無條件DELETE相同的 效果,不過它會更快,因為它沒有實際掃描表。此外,它會立刻回收磁盤空間, 而不是要求一個后續(xù)的VACUUM操作。在大表上 它最有用。

參數(shù)

name

要截斷的表的名字(可以是模式限定的)。如果在表名前指定了 ONLY,則只會截斷該表。如果沒有指定ONLY, 該表及其所有后代表(如果有)都會被截斷??蛇x地,可以在表名后指定 *來顯式地包括后代表。

RESTART IDENTITY

自動重新開始被截斷表的列所擁有的序列。

CONTINUE IDENTITY

不更改序列值。這是默認(rèn)值。

CASCADE

自動截斷所有對任一所提及表有外鍵引用的表以及任何由于 CASCADE被加入到組中的表。

RESTRICT

如果任一表上具有來自命令中沒有列出的表的外鍵引用,則拒絕截斷。這是默認(rèn)值。

注解

要截斷一個表,你必須具有其上的TRUNCATE特權(quán)。

TRUNCATE在要操作的表上要求一個 ACCESS EXCLUSIVE鎖,這會阻塞所有其他在該表上的 并發(fā)操作。當(dāng)指定RESTART IDENTITY時,任何需要被 重新開始的序列也會被排他地鎖住。如果要求表上的并發(fā)訪問,那么 應(yīng)該使用DELETE命令。

TRUNCATE不能被用在被其他表外鍵引用的表上, 除非那些表也在同一個命令中被階段。這些情況中的可行性檢查將會 要求表掃描,并且重點不是為了做掃描。CASCADE 選項可以被用來自動地包括所有依賴表 — 但使用它時要非常 小心,否則你可能丟失數(shù)據(jù)! 特別注意的是,當(dāng)要被截斷的表是一個分區(qū)時,兄弟節(jié)點分區(qū)不會受到影響,但是所有的引用表都發(fā)生級聯(lián),他們的分區(qū)也沒有區(qū)別。

TRUNCATE將不會引發(fā)表上可能存在的任何 ON DELETE觸發(fā)器。但是它將會引發(fā) ON TRUNCATE觸發(fā)器。如果在這些表的任意一個 上定義了ON TRUNCATE觸發(fā)器,那么所有的 BEFORE TRUNCATE觸發(fā)器將在任何截斷發(fā)生之前 被引發(fā),而所有AFTER TRUNCATE觸發(fā)器將在最后 一次截斷完成并且所有序列被重置之后引發(fā)。觸發(fā)器將以表被處理的順 序被引發(fā)(首先是那些被列在命令中的,然后是由于級聯(lián)被加入的)。

TRUNCATE不是 MVCC 安全的。截斷之后, 如果并發(fā)事務(wù)使用的是一個在截斷發(fā)生前取得的快照, 表將對這些并發(fā)事務(wù)呈現(xiàn)為空。詳見第 13.5 節(jié)。

從表中數(shù)據(jù)的角度來說,TRUNCATE是事務(wù)安全的: 如果所在的事務(wù)沒有提交,階段將會被安全地回滾。

在指定了RESTART IDENTITY時,隱含的 ALTER SEQUENCE RESTART操作也會被事務(wù)性地完成。 也就是說,如果所在事務(wù)沒有提交,它們也將被回滾。注意如果 事務(wù)回滾前在被重啟序列上還做了額外的序列操作,這些操作在序列上的效果 也將被回滾,但是它們在currval()上的效果不會被回滾。也就 是說,在事務(wù)之后, currval()將繼續(xù)反映在失敗事務(wù)內(nèi)得到的 最后一個序列值,即使序列本身可能已經(jīng)不再與此一致。這和失敗事務(wù)之后 currval()的通常行為類似。

TRUNCATE當(dāng)前不支持外部表。 這表示如果一個指定的表具有任何外部的后代表,這個命令將會失敗。

示例

截斷表bigtablefattable

TRUNCATE bigtable, fattable;

做同樣的事情,并且還重置任何相關(guān)聯(lián)的序列發(fā)生器:

TRUNCATE bigtable, fattable RESTART IDENTITY;

截斷表othertable,并且級聯(lián)地截斷任何通過 外鍵約束引用othertable的表:

TRUNCATE othertable CASCADE;

兼容性

SQL:2008 標(biāo)準(zhǔn)包括了一個TRUNCATE命令, 語法是TRUNCATE TABLE tablename 。子句 CONTINUE IDENTITY/RESTART IDENTITY 也出現(xiàn)在了該標(biāo)準(zhǔn)中,但是含義有些不同。這個命令的一些并發(fā)行為被標(biāo)準(zhǔn) 留給實現(xiàn)來定義,因此如果必要應(yīng)該考慮上述注解并且與其他實現(xiàn)進(jìn)行比較。

參見

DELETE


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號