DELETE — Supprimer des lignes d'une table
[ WITH [ RECURSIVE ]requête_with
[, ...] ] DELETE FROM [ ONLY ]nom_table
[ * ] [ [ AS ]alias
] [ USINGelement_from
] [ WHEREcondition
| WHERE CURRENT OFnom_curseur
] [ RETURNING { * |expression_sortie
[ [ AS ]nom_sortie
] } [, ...] ]
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.
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
.
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êteDELETE
. 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.
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.
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.
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;
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
.