Partager via


Suppression de lignes au moyen de l'instruction DELETE

L'instruction DELETE supprime une ou plusieurs lignes d'une table ou d'une vue.

Dans sa forme la plus simple, la syntaxe de l'instruction DELETE est la suivante :

DELETE table_or_view

FROM table_sources

WHERE search_condition

Le paramètre table_or_view nomme la table ou la vue dont les lignes doivent être supprimées. Toutes les lignes contenues dans table_or_view répondant à la condition de recherche WHERE sont supprimées. Si aucune clause WHERE n'est spécifiée, toutes les lignes de table_or_view sont supprimées. La clause FROM spécifie des tables, des vues supplémentaires et des conditions de jointure que les prédicats définis dans la condition de recherche de la clause WHERE utilisent pour qualifier les lignes à supprimer de table_or_view. Les lignes sont uniquement supprimées de la table nommée dans table_or_view et pas des tables nommées dans la clause FROM

Une table dont toutes les lignes ont été supprimées reste malgré tout dans la base de données. L'instruction DELETE ne fait que supprimer les lignes de la table. Pour supprimer la table, vous devez utilisez l'instruction DROP TABLE.

Suppression de lignes d'un segment de mémoire

Lorsque des lignes sont supprimées d'un segment de mémoire, le moteur de base de données peut utiliser le verrouillage des lignes ou des pages pour effectuer cette opération. Par conséquent, les pages rendues vides par l'opération de suppression restent allouées au segment de mémoire. Lorsque des pages vides ne sont pas désallouées, l'espace associé ne peut pas être réutilisé par d'autres objets de la base de données.

Pour supprimer des lignes d'un segment de mémoire et désallouer des pages, utilisez l'une des méthodes suivantes.

  • Spécifiez l'indicateur TABLOCK dans l'instruction DELETE. Lorsque l'instruction TABLOCK est utilisée, l'opération de suppression adopte un verrou partagé de la table plutôt qu'un verrou de ligne ou de page. Les pages sont ainsi désallouées. Pour plus d'informations sur l'indicateur TABLOCK, consultez Indicateurs de table (Transact-SQL).

  • Utilisez l'indicateur TRUNCATE TABLE si vous souhaitez supprimer toutes les lignes de la table.

  • Créez un index cluster dans le segment de mémoire avant de supprimer les lignes. Une fois les lignes supprimées, vous pouvez supprimer l'index cluster. Cette méthode prend plus de temps que les méthodes précédentes et utilise davantage de ressources temporaires.

Pour plus d'informations sur le verrouillage, consultez Verrouillage du moteur de base de données.

Exemples

L'exemple suivant supprime toutes les lignes de la table SalesPersonQuotaHistory parce qu'une clause WHERE n'est pas utilisée pour limiter le nombre de lignes supprimées.

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory;
GO

L'exemple suivant supprime toutes les lignes de la table ProductCostHistory qui, dans la colonne StandardCost, ont une valeur supérieure à 1000.00.

USE AdventureWorks;
GO
DELETE FROM Production.ProductCostHistory
WHERE StandardCost > 1000.00;
GO

L'exemple suivant montre l'extension Transact-SQL utilisée pour supprimer des enregistrements d'une table de base en fonction d'une jointure ou d'une sous-requête corrélée. La première instruction DELETE montre une sous-requête compatible ISO tandis que la seconde instruction DELETE montre l'extension Transact-SQL. Les deux requêtes suppriment des lignes de la table SalesPersonQuotaHistory, en se basant sur les titres stockés dans la table SalesPerson.

-- SQL-2003 Standard subquery

USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
WHERE SalesPersonID IN 
    (SELECT SalesPersonID 
     FROM Sales.SalesPerson 
     WHERE SalesYTD > 2500000.00);
GO
-- Transact-SQL extension
USE AdventureWorks;
GO
DELETE FROM Sales.SalesPersonQuotaHistory 
FROM Sales.SalesPersonQuotaHistory AS spqh
    INNER JOIN Sales.SalesPerson AS sp
    ON spqh.SalesPersonID = sp.SalesPersonID
WHERE sp.SalesYTD > 2500000.00;
GO