Vider une table

Il arrive parfois que nous voulions vider une table au complet. Par défaut les gens utilisent la commande « DELETE » fournis par les SGBD. Sur les petites tables, cela n’impacte pas trop mais lorsqu’il y a un bon nombre d’enregistrements dans la table, les délais d’exécutions peuvent être assez long. Dans les faits, la commande « Delete » permet de faire un retour arrière en cas de problématique, donc le SGBD se doit d’écrire dans son journal de transactions les lignes supprimées peu importe la saveur (Oracle, SQL Server, Mysql, etc.) du SGBD. La plupart du temps, cette action de vider la table, ne nécessite pas de retour arrière (ROLLBACK). Pour ce faire la commande « TRUNCATE TABLE » nom table permet de faire cette opération est pratiquement instantanée. Pour pouvoir utiliser cette commande, la table à vider ne doit pas avoir de contrainte référentielle (clé étrangère). Par contre, selon le SGBD des comportements peuvent variés selon le contexte.

Oracle : La commande TRUNCATE TABLE est un DML (Data Manipulation Language) au même titre que les commandes « create table », « alter table », « drop table », ce qui ne permet d’en aucun cas de faire un rollback car aucune transaction n’est possible. Si une la table fait référence à une autre, la commande retournera une erreur d’exécution. Pour pallier ce problème il suffit de désactiver les contraintes de références.

SQL SERVER :La commande TRUNCATE TABLE désalloue les pages utilisées et conserve dans le journal de tranactions cette désallocation. Il est également possible de faire un ROLLBACK si la commande est contenue dans une transaction (BEGIN TRANSACTION … COMMIT ou ROLLBACK). TRUNCATE TABLE réinitialise les colonnes IDENTITY. Il n’est pas possible d’utiliser la commande TRUNCATE TABLE lorsque la table est référencée par des contraintes référentielles (Clé étrangères) sauf si la contrainte fait une référence à elle-même (référence récursive).

MYSQL : La commande TRUNCATE TABLE pour ce SGBD change de comportement selon l’engin utilisé. Avec INNODB, s’il existe une contrainte référentielle (clé étrangère), la commande se comporte comme un DELETE (Suppression rangée par rangée). Si la contrainte rencontre un enregistrement parent, la commande retourne une erreur d’exécution sauf si la contrainte spécifie un DELETE CASCADE. S’il n’y a pas de clé étrangère, la commande TRUNCATE TABLE détruit et recrée la table vide. Cette dernière action est effectuée pour tous les autres engins et les colonnes en AUTO INCREMENT recommencent leur incrémentation avec la valeur initiale.

Pour tous les autres SGBD, ils reprendront les principes d’une des trois manières décrites mais en général selon les principes d’ORACLE ou de SQL SERVER.