Documentation PostgreSQL 14.22 » Référence » Commandes SQL » DELETE

Précédent | Niveau supérieur | Suivant
DECLARE | Sommaire | DISCARD

## DELETE

DELETE — Supprimer des lignes d'une table

## Synopsis

    [ WITH [ RECURSIVE ] requête_with [, ...] ]
    DELETE FROM [ ONLY ] nom_table [ * ] [ [ AS ] alias ]
        [ USING element_from ]
        [ WHERE condition | WHERE CURRENT OF nom_curseur ]
        [ RETURNING { * | expression_sortie [ [ AS ] nom_sortie ] } [, ...] ]

## Description

`DELETE` supprime de la table spécifiée les lignes qui satisfont la clause `WHERE`. Si la clause `WHERE` est absente, toutes les lignes de la table sont supprimées. Le résultat est une table valide, mais vide.

### Astuce

`TRUNCATE` fournit un mécanisme plus rapide de suppression de l'ensemble des lignes d'une table.

Il existe deux façons de supprimer des lignes d'une table en utilisant les informations d'autres tables de la base de données : les sous-sélections ou la spécification de tables supplémentaires dans la clause `USING`. La technique la plus appropriée dépend des circonstances.

La clause `RETURNING` optionnelle fait que `DELETE` calcule et renvoie le(s) valeur(s) basée(s) sur chaque ligne en cours de suppression. Toute expression utilisant les colonnes de la table et/ou les colonnes de toutes les tables mentionnées dans `USING` peut être calculée. La syntaxe de la liste `RETURNING` est identique à celle de la commande `SELECT`.

Il est nécessaire de posséder le droit `DELETE` sur la table pour en supprimer des lignes, et le droit `SELECT` sur toute table de la clause `USING` et sur toute table dont les valeurs sont lues dans la `condition`.

## Paramètres

`requête_with`

  La clause `WITH` vous permet de spécifier une ou plusieurs sous-requêtes qui peuvent être référencées par nom dans la requête`DELETE`. Voir Section 7.8 et SELECT pour les détails.

`nom_table`

  Le nom (éventuellement qualifié du nom du schéma) de la table dans laquelle il faut supprimer des lignes. Si `ONLY` est indiqué avant le nom de la table, les lignes supprimées ne concernent que la table nommée. Si `ONLY` n'est pas indiquée, les lignes supprimées font partie de la table nommée et de ses tables filles. En option, `*` peut être ajouté après le nom de la table pour indiquer explicitement que les tables filles doivent être inclues.

`alias`

  Un nom de substitution pour la table cible. Quand un alias est fourni, il cache complètement le nom réel de la table. Par exemple, avec `DELETE FROM foo AS f`, le reste de l'instruction `DELETE` doit référencer la table avec `f` et non plus `foo`.

`element_from`

  Une expression de table, qui permet de faire apparaître des colonnes d'autres tables dans la condition `WHERE`. Cela utilise la même syntaxe que la clause Clause FROM d'une instruction `SELECT` ; par exemple, un alias peut être spécifié pour un nom de table. Ne pas répéter la table cible comme un `element_from` sauf si vous souhaitez configurer une jointure avec elle-même (auquel cas elle doit apparaître avec un alias dans `element_from`).

`condition`

  Une expression retournant une valeur de type `boolean`. Seules les lignes pour lesquelles cette expression renvoie `true` seront supprimées.

`nom_curseur`

  Le nom du curseur à utiliser dans une condition `WHERE CURRENT OF`. La ligne à supprimer est la dernière ligne récupérée avec ce curseur. Le curseur doit être une requête sans regroupement sur la table cible du `DELETE`. Notez que `WHERE CURRENT OF` ne peut pas se voir ajouter de condition booléenne. Voir DECLARE pour plus d'informations sur l'utilisation des curseurs avec `WHERE CURRENT OF`.

`expression_sortie`

  Une expression à calculer et renvoyée par la commande `DELETE` après chaque suppression de ligne. L'expression peut utiliser tout nom de colonne de la table nommée `nom_table` ou des tables listées dans la clause `USING`. Indiquez `*` pour que toutes les colonnes soient renvoyées.

`nom_sortie`

  Un nom à utiliser pour une colonne renvoyée.

## Sorties

En cas de succès, une commande `DELETE` renvoie une information de la forme

    DELETE nombre

Le `nombre` correspond au nombre de lignes supprimées. Notez que ce nombre peut être inférieur au nombre de lignes qui satisfont la `condition` lorsque les lignes ont été supprimées via un trigger `BEFORE DELETE`. Si `nombre` vaut 0, aucune ligne n'a été supprimée par cette requête (ce qui n'est pas considéré comme une erreur).

Si la commande `DELETE` contient une clause `RETURNING`, le résultat sera similaire à celui d'une instruction `SELECT` contenant les colonnes et les valeurs définies dans la liste `RETURNING`, à partir de la liste des lignes supprimées par la commande.

## Notes

PostgreSQL autorise les références à des colonnes d'autres tables dans la condition `WHERE` par la spécification des autres tables dans la clause `USING`. Par exemple, pour supprimer tous les films produits par un producteur donné :

    DELETE FROM films USING producteurs
      WHERE id_producteur = producteurs.id AND producteurs.nom = 'foo';

Pour l'essentiel, une jointure est établie entre `films` et `producteurs` avec toutes les lignes jointes marquées pour suppression. Cette syntaxe n'est pas standard. Une façon plus standard de procéder consiste à utiliser une sous-selection :

    DELETE FROM films
      WHERE id_producteur IN (SELECT id FROM producteur WHERE nom = 'foo');

Dans certains cas, la jointure est plus facile à écrire ou plus rapide à exécuter que la sous-sélection.

## Exemples

Supprimer tous les films qui ne sont pas des films musicaux :

    DELETE FROM films WHERE genre <> 'Comédie musicale';

Effacer toutes les lignes de la table `films` :

    DELETE FROM films;

Supprimer les tâches terminées tout en renvoyant le détail complet des lignes supprimées :

    DELETE FROM taches WHERE statut = 'DONE' RETURNING *;

Supprimer la ligne de `taches` sur lequel est positionné le curseur `c_taches` :

    DELETE FROM taches WHERE CURRENT OF c_taches;

## Compatibilité

Cette commande est conforme au standard SQL, à l'exception des clauses `USING` et `RETURNING`, qui sont des extensions de PostgreSQL, comme la possibilité d'utiliser la clause `WITH` avec `DELETE`.

## Voir aussi

TRUNCATE