TRUNCATE — vide une table ou un ensemble de tables
TRUNCATE [ TABLE ] [ ONLY ] nom
[ * ] [, ... ]
[ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
La commande TRUNCATE
supprime rapidement toutes les
lignes d'un ensemble de tables. Elle a le même effet qu'un
DELETE
non qualifié sur chaque table, mais comme elle ne
parcourt par la table, elle est plus rapide. De plus, elle récupère
immédiatement l'espace disque, évitant ainsi une opération
VACUUM
. Cette commande est particulièrement utile pour
les tables volumineuses.
nom
Le nom d'une table à vider (pouvant être qualifié par le schéma). Si la
clause ONLY
est précisée avant le nom de la table,
seule cette table est tronquée. Dans le cas contraire, la table et toutes
ses tables filles (si elle en a) sont tronquées. En option,
*
peut être ajouté après le nom de la table pour
indiquer explicitement que les tables filles sont inclues.
RESTART IDENTITY
Redémarre les séquences intégrées aux colonnes des tables tronquées.
CONTINUE IDENTITY
Ne change pas la valeur des séquences. C'est la valeur par défaut.
CASCADE
Vide toutes les tables qui ont des références de clés étrangères sur une
des tables nommées et sur toute table ajoutée au groupe à cause du
CASCADE
.
RESTRICT
Refuse le vidage si une des tables a des références de clés étrangères sur une table qui ne sont pas listées dans la commande. Cette option est active par défaut.
Vous devez avoir le droit TRUNCATE
sur la table que vous
voulez tronquer.
TRUNCATE
nécessite un verrou d'accès exclusif
(ACCESS EXCLUSIVE
) sur chaque table qu'il traite, ce qui
bloque toutes les autres opérations en parallèle sur cette table. Quand
RESTART IDENTITY
est spécifié, toutes les séquences qui
doivent être réinitialisées ont un verrou exclusif. Si un
accès concurrent est nécessaire, alors la commande
DELETE
doit être utilisée.
TRUNCATE
ne peut pas être utilisé sur une table
référencée par d'autres tables au travers de clés étrangères, sauf si ces
tables sont aussi comprises dans la commande. Dans le cas contraire, la
vérification nécessiterait des parcours complets de tables, ce qui n'est pas
le but de la commande TRUNCATE
. L'option
CASCADE
est utilisable pour inclure automatiquement
toutes les tables dépendantes -- faites attention lorsque vous utilisez
cette option parce que vous pourriez perdre des données que vous auriez
souhaitez conserver ! Notez en particulier que, quand la table à
tronquer est une partition, les partitions filles ne sont pas touchées mais
la cascade survient pour toutes les tables référencées et toutes leurs
partitions sans distinction.
TRUNCATE
ne déclenchera aucun trigger ON
DELETE
qui pourrait exister sur les tables. Par contre, il
déclenchera les triggers ON TRUNCATE
. Si des triggers
ON TRUNCATE
sont définis sur certaines des tables,
alors tous les triggers BEFORE TRUNCATE
sont déclenchés
avant que le troncage n'intervienne, et tous les triggers AFTER
TRUNCATE
sont déclenchés après la réalisation du dernier
troncage et toutes les séquences sont réinitialisées. Les triggers se
déclencheront dans l'ordre de traitement des
tables (tout d'abord celles listées dans la commande, puis celles ajoutées
à cause des cascades).
TRUNCATE
n'est pas sûre au niveau MVCC. Après la
troncature, la table apparaîtra vide aux transactions concurrentes si elles
utilisent une image prise avant la troncature. Voir Section 13.6 pour plus de détails.
TRUNCATE
est compatible avec le système des transactions.
Les données seront toujours disponibles si la transaction est annulée.
Quand RESTART IDENTITY
est spécifié, les opérations
ALTER SEQUENCE RESTART
impliquées sont aussi réalisées
de façon transactionnelles. Autrement dit, elles seront annulées si la
transaction n'est pas validée. Faites attention au fait que si
des opérations supplémentaires sur les séquences impliquées est faite avant
l'annulation de la transaction, les effets de ces opérations sur les
séquences seront aussi annulés mais pas les effets sur
currval()
; autrement dit, après la transaction,
currval()
continuera à refléter la dernière valeur de
la séquence obtenue au sein de la transaction échouée, même si la séquence
elle-même pourrait ne plus être en adéquation avec cela. C'est similaire
au comportement habituel de currval()
après une
transaction échouée.
TRUNCATE
peut être utilisé pour les tables distantes si
c'est supporté par le « Foreign Data Wrapper ». Voir, par exemple,
postgres_fdw.
Vider les tables grossetable
et
grandetable
:
TRUNCATE grossetable, grandetable;
La même chose, en réinitialisant les générateurs des séquences associées :
TRUNCATE bigtable, fattable RESTART IDENTITY;
Vide la table uneautretable
, et cascade cela à toutes
les tables qui référencent uneautretable
via des
contraintes de clés étrangères :
TRUNCATE uneautretable CASCADE;
Le standard SQL:2008 inclut une commande TRUNCATE
avec la
syntaxe TRUNCATE TABLE
.
Les clauses nom_table
CONTINUE IDENTITY
/RESTART IDENTITY
font aussi partie du standard mais ont une signification légèrement différente,
quoique en rapport. Certains des comportements de concurrence de cette commande
sont laissés au choix de l'implémentation par le standard, donc les notes
ci-dessus doivent être comprises et comparées avec les autres implémentations
si nécessaire.