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.
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.
Redémarre les séquences intégrées aux colonnes des tables tronquées.
Ne change pas la valeur des séquences. C'est la valeur par défaut.
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.
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. 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 !
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 tronquage n'intervienne, et tous les triggers AFTER TRUNCATE sont déclenchés après la réalisation du dernier tronquage. 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 compatible avec MVCC (voir Chapitre 13, Contrôle d'accès simultané pour des informations générales sur MVCC). Après un vidage, la table apparaîtra vide pour toutes les transactions en cours même si elles utilisent une image prise avant le début du vidage. Ceci est un problème pour une transaction qui n'a pas eu un accès à la table avant le vidage -- toute transaction qui y a accédé avant détient au moins un verrou ACCESS SHARE qui bloquera TRUNCATE jusqu'à la fin de la transaction. Donc le vidage ne causera aucune incohérence apparente dans le contenu de la table pour des requêtes successives sur la même table, mais il causera une incohérence visble entre la table tronquée et les autres tables de la base.
Néanmoins, TRUNCATE est compatible avec le système des transactions : un tronquage pourrait être annulée si la transaction en cours n'est pas validée.
TRUNCATE est compatible avec le système des transactions. Les données seront toujours disponibles si la transaction est annulée.
Les opérations sur les séquences (ALTER SEQUENCE RESTART) réalisées en conséquence de l'utilisation de l'option RESTART IDENTITY sont non transactionnelles et ne seront pas annulées en cas d'échec. Pour minimiser les risques, ces opérations sont réalisées seulement après que tout le reste du travail de TRUNCATE ne soit terminé. Néanmoins, il y a toujours un risque si TRUNCATE est exécuté dans un bloc de transaction qui est annulé ultérieurement. Par exemple, avec :
BEGIN; TRUNCATE TABLE foo RESTART IDENTITY; COPY foo FROM ...; COMMIT;
Si le COPY échoue, les données de la table seront restaurées mais les séquences seront laissées avec des valeurs probablement inférieures à celles qu'elles avaient avant, ce qui pourrait amener à des échecs de clés dupliquées ou à d'autres problèmes dans les transactions suivantes. Si cela peut devenir un problème, il est bien mieux d'éviter d'utiliser RESTART IDENTITY, et d'accepter que le nouveau contenu de la table aura des numéros de séquence bien supérieur à l'ancien.
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 nom_table. Les clauses 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.