TRUNCATE TABLE (Transact-SQL)
Supprime toutes les lignes d'une table sans enregistrer les suppressions de ligne individuelles dans le journal. D'un point de vue fonctionnel, l'instruction TRUNCATE TABLE est identique à 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.
Conventions de syntaxe de 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.
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 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 ;
- 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 2005 permet de supprimer ou de tronquer des tables dotées de plus de 128 extensions, sans maintenir des verrous simultanés sur toutes les extensions requises pour la suppression. Pour plus d'informations, consultez Suppression et reconstruction d'objets volumineux.
Autorisations
L'autorisation minimale requise est ALTER sur table_name. Les autorisations TRUNCATE TABLE sont octroyées par défaut au propriétaire de la table, aux membres du rôle de serveur fixe sysadmin et des rôles de base de données fixes db_owner et db_ddladmin. Elles 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. Pour plus d'informations, consultez Utilisation d'EXECUTE AS pour créer des jeux d'autorisations personnalisés.
Exemple
L'exemple suivant supprime toutes les données de la table JobCandidate
. Les instructions SELECT sont comprises avant et après l'instruction TRUNCATE TABLE pour en comparer les résultats.
USE AdventureWorks;
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)
Autres ressources
Architecture physique du journal des transactions
Verrouillage du moteur de base de données