?
This document uses PHP Chinese website manual Release
TRUNCATE [ TABLE ] [ ONLY ] name [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
TRUNCATE快速地從一堆表中刪除所有行。它和在每個(gè) 表上進(jìn)行無(wú)條件的DELETE有同樣的效果,不過(guò)因?yàn)樗? 不做表掃描,因而快得多。在大表上最有用。
要清空的表名字(可以有模式修飾)。如果聲明ONLY,只有 那個(gè)表會(huì)被清空。如果沒(méi)有聲明ONLY,這個(gè)表以及其所有子 表(若有)會(huì)被清空。
Warning |
自動(dòng)重啟被清空的列的序列。 |
Warning |
不要改變序列的缺省值。此為缺省。 |
級(jí)聯(lián)清空所有在該表上有外鍵引用的表,或者由于CASCADE 而被添加到組中的表。
如果其他表在該表上有外鍵引用則拒絕清空。此為缺省。
你必須對(duì)表有TRUNCATE以清空它。
TRUNCATE取得了一個(gè)其操作的每個(gè)表上的ACCESS EXCLUSIVE鎖, 這阻塞了表上的所有其他并發(fā)操作。如果請(qǐng)求對(duì)一個(gè)表的并發(fā)訪(fǎng)問(wèn),那么反而應(yīng)該使用DELETE 命令。
TRUNCATE不能用于有參照其他表的外鍵的表,除非所有這些表也在相同的命令中 被縮短。在這種情況下檢查有效性需要掃描表,并且整個(gè)點(diǎn)不會(huì)做一個(gè)。CASCADE 選項(xiàng)可以用于自動(dòng)包括所有依賴(lài)表—但在使用該選項(xiàng)時(shí)會(huì)非常有用,否則你可能會(huì)失去你 您不想要的數(shù)據(jù)!
TRUNCATE不會(huì)觸發(fā)人任何可能為表存在的ON DELETE觸發(fā)器。 但它會(huì)觸發(fā)ON TRUNCATE觸發(fā)器。如果ON TRUNCATE觸發(fā)器 為任何表定義,然后所有的BEFORE TRUNCATE觸發(fā)器會(huì)在任何事物發(fā)生之前 觸發(fā),并且所有AFTER TRUNCATE觸發(fā)器會(huì)在最后一個(gè)事務(wù)執(zhí)行后被觸發(fā)。 該觸發(fā)器會(huì)以表執(zhí)行的順序觸發(fā)(首先是命令中列出的,然后是任何基于級(jí)聯(lián)添加的)。
TRUNCATE并不是MVCC-safe的(參閱Chapter 13獲取關(guān)于MVCC的基本信息)。 階段以后,標(biāo)記將會(huì)對(duì)所有的并發(fā)事務(wù)出現(xiàn)空,即使他們?cè)诮財(cái)喟l(fā)生前使用快照。這將 是一個(gè)針對(duì)事物發(fā)生之前訪(fǎng)問(wèn)截?cái)啾淼氖聞?wù)的問(wèn)題—任何這么做的事務(wù)至少持有一個(gè) ACCESS SHARE鎖,這將鎖TRUNCATE直到事務(wù)完成。所以 所以截?cái)嗖粫?huì)導(dǎo)致在相同表連續(xù)查詢(xún)的表內(nèi)容上的明顯不一致,但會(huì)導(dǎo)致截?cái)啾砗蛿?shù)據(jù)庫(kù)中其他表 在內(nèi)容上可見(jiàn)的不一致性。
TRUNCATE對(duì)表中的數(shù)據(jù)是事務(wù)安全的:如果周?chē)挛锊惶峤唬w世五會(huì)安全回滾。
任何作為使用RESTART IDENTITY選項(xiàng)的結(jié)果的ALTER SEQUENCE RESTART 操作都是非事務(wù)性的并將回滾失敗。為了最小化該風(fēng)險(xiǎn),這些操作僅在所有剩下的 TRUNCATE工作做完以后才執(zhí)行。然而,若TRUNCATE在一個(gè)之后終止的 事務(wù)鎖內(nèi)執(zhí)行,仍然是有風(fēng)險(xiǎn)的。例如,思考:
BEGIN; TRUNCATE TABLE foo RESTART IDENTITY; COPY foo FROM ...; COMMIT;
如果COPY中途失敗,表數(shù)據(jù)回滾正確,但是序列將會(huì)剩下小于他們之前擁有的值, 可能會(huì)導(dǎo)致關(guān)鍵復(fù)制失敗或者在后來(lái)事務(wù)中的其他問(wèn)題。如果這可能是一個(gè)問(wèn)題,最好避免使用 RESTART IDENTITY,并接受表的新內(nèi)容將比舊的有更高的系列號(hào)。
階段表bigtable和fattable:
TRUNCATE bigtable, fattable;
清空bigtable和fattable表:
TRUNCATE bigtable, fattable;
同樣地,也重置任何相關(guān)的序列生成器:
TRUNCATE bigtable, fattable RESTART IDENTITY;
截?cái)啾?tt class="LITERAL">othertable,級(jí)聯(lián)到通過(guò)外鍵約束參照othertable 的任何表。
TRUNCATE othertable CASCADE;
清空othertable表,并且級(jí)聯(lián)清空所有通過(guò)外鍵 約束引用othertable的表:
TRUNCATE othertable CASCADE;
SQL:2008標(biāo)準(zhǔn)包括一個(gè)有語(yǔ)法 TRUNCATE TABLE tablename的 TRUNCATE命令。CONTINUE IDENTITY/RESTART IDENTITY 子句也出現(xiàn)在那個(gè)標(biāo)準(zhǔn)中,但是有輕微的不同和相關(guān)的含義。該命令的一些并發(fā)行為通過(guò)標(biāo)準(zhǔn)實(shí)現(xiàn)了定義, 所以,若必要,上面的注意應(yīng)該與其他實(shí)現(xiàn)考慮和比較。