<!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/truncate.sgml,v 1.23 2007/04/07 17:12:15 tgl Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/truncate.sgml,v 1.24 2007/05/11 19:40:08 neilc Exp $
PostgreSQL documentation
-->
<command>TRUNCATE</command> quickly removes all rows from a set of
tables. It has the same effect as an unqualified
<command>DELETE</command> on each table, but since it does not actually
- scan the tables it is faster; furthermore it reclaims disk space
- immediately, rather than requiring a subsequent vacuum operation.
- This is most useful on large tables.
+ scan the tables it is faster. Furthermore, it reclaims disk space
+ immediately, rather than requiring a subsequent <command>VACUUM</command>
+ operation. This is most useful on large tables.
</para>
</refsect1>
in the same command. Checking validity in such cases would require table
scans, and the whole point is not to do one. The <literal>CASCADE</>
option can be used to automatically include all dependent tables —
- but be very careful when using this option, else you might lose data you
+ but be very careful when using this option, or else you might lose data you
did not intend to!
</para>
<para>
- <command>TRUNCATE</> will not run any user-defined <literal>ON
- DELETE</literal> triggers that might exist for the tables.
+ <command>TRUNCATE</> will not run any <literal>ON DELETE</literal>
+ triggers that might exist for the tables.
</para>
- <para>
- <command>TRUNCATE</> is not MVCC-safe (see <xref linkend="mvcc">
- for general information about MVCC). After truncation, the table
- will appear empty to all concurrent transactions, even if they are
- using a snapshot taken before the truncation occurred. This will
- only be an issue for a transaction that did not touch the table
- before the truncation started — any transaction that has done
- so would hold at least <literal>ACCESS SHARE</literal> lock,
- which would block
- <command>TRUNCATE</> until that transaction completes. So
- truncation will not cause any apparent inconsistency in the table
- contents for successive queries on the same table, but it could
- cause visible inconsistency between the contents of the
- truncated table and other tables.
- </para>
-
- <para>
- <command>TRUNCATE</> is transaction-safe, however: the truncation
- will roll back if the surrounding transaction does not commit.
- </para>
+ <warning>
+ <para>
+ <command>TRUNCATE</> is not MVCC-safe (see <xref linkend="mvcc">
+ for general information about MVCC). After truncation, the table
+ will appear empty to all concurrent transactions, even if they
+ are using a snapshot taken before the truncation occurred. This
+ will only be an issue for a transaction that did not access the
+ truncated table before the truncation happened — any
+ transaction that has done so would hold at least an
+ <literal>ACCESS SHARE</literal> lock, which would block
+ <command>TRUNCATE</> until that transaction completes. So
+ truncation will not cause any apparent inconsistency in the table
+ contents for successive queries on the same table, but it could
+ cause visible inconsistency between the contents of the truncated
+ table and other tables in the database.
+ </para>
+
+ <para>
+ <command>TRUNCATE</> is transaction-safe, however: the truncation
+ will be safely rolled back if the surrounding transaction does not
+ commit.
+ </para>
+ </warning>
</refsect1>
<refsect1>
Truncate the tables <literal>bigtable</literal> and <literal>fattable</literal>:
<programlisting>
-TRUNCATE TABLE bigtable, fattable;
+TRUNCATE bigtable, fattable;
</programlisting>
</para>
<para>
Truncate the table <literal>othertable</literal>, and cascade to any tables
- that are referencing <literal>othertable</literal> via foreign-key
+ that reference <literal>othertable</literal> via foreign-key
constraints:
<programlisting>