TRUNCATE TABLE (Transact-SQL)

Supprime toutes les lignes d'une table sans enregistrer les suppressions de ligne individuelles dans le journal. L'instruction TRUNCATE TABLE est semblable à l'instruction DELETE sans la clause WHERE. Cependant, l'instruction TRUNCATE TABLE est plus rapide et utilise moins de ressources système et de ressources du journal des transactions.

Icône Lien de rubrique Conventions de la syntaxe Transact-SQL

Syntaxe

TRUNCATE TABLE 
    [ { database_name .[ schema_name ] . | schema_name . } ]
    table_name
[ ; ]

Arguments

  • database_name
    Nom de la base de données.

  • schema_name
    Nom du schéma auquel appartient la table.

  • table_name
    Nom de la table à tronquer ou dont toutes les lignes sont supprimées. table_name doit être un littéral. table_name ne peut pas être une fonction OBJECT_ID() ou une variable.

Notes

Comparée à l'instruction DELETE, l'instruction TRUNCATE TABLE offre les avantages suivants :

  • Moindre espace du journal des transactions utilisé.

    L'instruction DELETE supprime une ligne à la fois et enregistre une entrée dans le journal des transactions pour chaque ligne supprimée. L'instruction TRUNCATE TABLE supprime les données en désallouant les pages de données utilisées pour stocker les données de la table. Elle enregistre uniquement les désallocations de page dans le journal des transactions.

  • Moins de verrous utilisés.

    Lors de l'exécution de l'instruction DELETE à l'aide d'un verrou de ligne, chaque ligne dans la table est verrouillée pour être supprimée. L'instruction TRUNCATE TABLE verrouille toujours la table (y compris un verrou de schéma SCH-M) et la page, mais pas les lignes.

  • Sans exception, les pages zéros demeurent dans la table.

    Après l'exécution d'une instruction DELETE, la table peut encore contenir des pages vides. Par exemple, des pages vides dans un segment ne peuvent pas être désallouées sans au moins un verrou de table exclusif (LCK_M_X). Si la suppression n'utilise pas de verrou de table, la table (le segment) contiendra beaucoup de pages vides. La suppression peut laisser des pages vides pour les index, bien que ces pages soient désallouées rapidement par un processus de nettoyage en arrière-plan.

L'instruction TRUNCATE TABLE supprime toutes les lignes d'une table, mais la structure de la table, ses colonnes, contraintes, index et autres éléments sont conservés. Pour supprimer la définition de la table en plus de ses données, utilisez l'instruction DROP TABLE.

Si la table contient une colonne d'identité, le compteur pour celle-ci est redéfini sur sa valeur de départ. Si aucune valeur de départ n'est définie, la valeur par défaut 1 est utilisée. Utilisez plutôt l'instruction DELETE pour conserver le compteur d'identité.

Restrictions

Vous ne pouvez pas utiliser l'instruction TRUNCATE TABLE sur les tables qui :

  • sont référencées par une contrainte FOREIGN KEY ; (Vous pouvez tronquer une table qui possède une clé étrangère qui fait référence à elle-même.)

  • participent à une vue indexée ;

  • sont publiées à l'aide d'une réplication transactionnelle ou de fusion.

Utilisez plutôt l'instruction DELETE pour les tables ayant au moins une de ces caractéristiques.

L'instruction TRUNCATE TABLE ne peut pas activer un déclencheur car l'opération ne consigne pas les suppressions de lignes dans le journal. Pour plus d'informations, consultez CREATE TRIGGER (Transact-SQL).

Troncation de grandes tables

Microsoft SQL Server permet de supprimer ou de tronquer des tables dotées de plus de 128 extensions, sans maintenir de verrous simultanés sur toutes les extensions requises pour la suppression.

Autorisations

L'autorisation minimale requise est ALTER sur table_name. Les autorisations TRUNCATE TABLE sont accordées par défaut au propriétaire de la table, aux membres du rôle serveur fixe sysadmin, aux rôles de base de données fixes db_owner et db_ddladmin et ne sont pas transférables. Cependant, vous pouvez incorporer l'instruction TRUNCATE TABLE dans un module, notamment une procédure stockée, et octroyer des autorisations adéquates au module à l'aide de la clause EXECUTE AS.

Exemples

L'exemple suivant supprime toutes les données de la table JobCandidate. Des instructions SELECT sont incluses avant et après l'instruction TRUNCATE TABLE pour comparer les résultats.

USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount 
FROM HumanResources.JobCandidate;
GO
TRUNCATE TABLE HumanResources.JobCandidate;
GO
SELECT COUNT(*) AS AfterTruncateCount 
FROM HumanResources.JobCandidate;
GO

Voir aussi

Référence

DELETE (Transact-SQL)

DROP TABLE (Transact-SQL)

IDENTITY (Propriété) (Transact-SQL)