DELETE¶
Supprimez les lignes d’une table. Vous pouvez utiliser une clause WHERE pour préciser quelles lignes doivent être supprimées. Si vous devez utiliser une ou plusieurs sous-requêtes ou une ou plusieurs tables supplémentaires pour identifier les lignes à supprimer, spécifiez la ou les sous-requêtes ou la ou les tables dans une clause USING.
Important
Contrairement à TRUNCATE TABLE, cette commande ne supprime pas l’historique de chargement des fichiers externes. Si vous supprimez des lignes chargées dans la table à partir d’un fichier préparé, vous ne pouvez pas charger à nouveau les données de ce fichier à moins de modifier le fichier et de le préparer de nouveau.
Syntaxe¶
DELETE FROM <table_name>
            [ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
            [ WHERE <condition> ]
Paramètres requis¶
- table_name
- Indique la table dont les lignes sont supprimées. 
Paramètres facultatifs¶
- USING additional_table_or_query [, ... ]
- Si vous devez faire référence à des tables supplémentaires dans la clause WHERE pour aider à identifier les lignes à supprimer, spécifiez ces noms de table dans la clause USING. Vous pouvez également utiliser la clause USING pour spécifier des sous-requêtes qui identifient les lignes à supprimer. - Si vous spécifiez une sous-requête, mettez la sous-requête entre parenthèses. - Si vous spécifiez plusieurs tables ou requêtes, utilisez une virgule pour les séparer. 
- WHERE condition
- Spécifie une condition à utiliser pour sélectionner les lignes à supprimer. Si ce paramètre est omis, toutes les lignes de la table sont supprimées, mais la table en question est conservée. 
Notes sur l’utilisation¶
- Lors de la suppression basée sur un JOIN (en spécifiant une clause - USING), il est possible qu’une ligne de la table cible soit jointe à plusieurs lignes de la ou des tables- USING. Si la condition DELETE est remplie pour l’une des combinaisons jointes, la ligne cible est supprimée.- Par exemple, les tables - tab1et- tab2données avec des colonnes- (k number, v number):- select * from tab1; -------+-------+ k | v | -------+-------+ 0 | 10 | -------+-------+ Select * from tab2; -------+-------+ k | v | -------+-------+ 0 | 20 | 0 | 30 | -------+-------+ - Si vous lancez la requête suivante, la ligne dans - tab1est jointe avec les deux lignes de- tab2:- DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k - Parce qu’au moins une paire jointe satisfait à la condition, la ligne est supprimée. Par conséquent, une fois l’instruction terminée, - tab1est vide.
Exemples¶
Supposons qu’une organisation qui loue des vélos utilise les tables suivantes :
- La table nommée leased_bicycles répertorie les vélos qui ont été loués. 
- La table nommée returned_bicycles répertorie les vélos qui ont été rendus récemment. Ces vélos doivent être retirés du tableau des vélos loués. 
Créez une table :
CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER); CREATE TABLE returned_bicycles (bicycle_id INTEGER);
Chargez les données :
INSERT INTO leased_bicycles (bicycle_ID, customer_ID) VALUES (101, 1111), (102, 2222), (103, 3333), (104, 4444), (105, 5555); INSERT INTO returned_bicycles (bicycle_ID) VALUES (102), (104);
Cet exemple montre comment utiliser la clause WHERE pour supprimer une ou plusieurs lignes spécifiées. Cet exemple effectue une suppression en fonction du bicycle_ID :
DELETE FROM leased_bicycles WHERE bicycle_ID = 105; +------------------------+ | number of rows deleted | |------------------------| | 1 | +------------------------+
Affichez les données après la suppression :
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | | 102 | 2222 | | 103 | 3333 | | 104 | 4444 | +------------+-------------+
Cet exemple montre comment utiliser la clause USING pour spécifier les lignes à supprimer. Cette clause USING spécifie la table returned_bicycles, qui répertorie les IDs des vélos à supprimer de la table leased_bicycles. La clause WHERE joint la table leased_bicycles à la table returned_bicycles, et les lignes de la table leased_bicycles qui ont le même bicycle_ID que les lignes correspondantes dans la table returned_bicycles sont supprimées.
BEGIN WORK; DELETE FROM leased_bicycles USING returned_bicycles WHERE leased_bicycles.bicycle_ID = returned_bicycles.bicycle_ID; TRUNCATE TABLE returned_bicycles; COMMIT WORK;
(Pour éviter d’essayer de supprimer à nouveau les mêmes lignes à l’avenir lorsque cela pourrait être inutile ou inapproprié, la table returned_bicycles est tronquée dans le cadre de la même transaction).
Affichez les données après la suppression :
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | | 103 | 3333 | +------------+-------------+
Supposons maintenant qu’un autre vélo (ou plusieurs) soit rendu :
INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
La requête suivante présente une clause USING qui contient une sous-requête (plutôt qu’une table) pour spécifier quels bicycle_IDs supprimer de la table leased_bicycles :
BEGIN WORK; DELETE FROM leased_bicycles USING (SELECT bicycle_ID AS bicycle_ID FROM returned_bicycles) AS returned WHERE leased_bicycles.bicycle_ID = returned.bicycle_ID; TRUNCATE TABLE returned_bicycles; COMMIT WORK;
Affichez les données après la suppression :
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | +------------+-------------+