Catégories :

Commandes DML - Général

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

nom_table

Indique la table dont les lignes sont supprimées.

Paramètres facultatifs

USING table_ou_requête_supplémentaire [, ... ]

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 tab1 et tab2 donné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 tab1 est 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, tab1 est 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 |
+------------+-------------+