DELETE

Remova linhas de uma tabela. Você pode usar uma cláusula WHERE para especificar quais linhas devem ser removidas. Se você precisar usar uma subconsulta(s) ou tabela(s) adicional(is) para identificar as linhas a serem removidas, especifique a(s) subconsulta(s) ou tabela(s) em uma cláusula USING.

Importante

Ao contrário de TRUNCATE TABLE, este comando não apaga o histórico de carregamento de arquivos externos. Se você apagar linhas carregadas na tabela a partir de um arquivo preparado, não poderá carregar os dados desse arquivo novamente, a menos que você modifique o arquivo e o prepare novamente.

Sintaxe

DELETE FROM <table_name>
            [ USING <additional_table_or_query> [, <additional_table_or_query> ] ]
            [ WHERE <condition> ]
Copy

Parâmetros obrigatórios

table_name

Especifica a tabela da qual as linhas são removidas.

Parâmetros opcionais

USING additional_table_or_query [, ... ]

Se você precisar consultar tabelas adicionais na cláusula WHERE para ajudar a identificar as linhas a serem removidas, então especifique os nomes dessas tabelas na cláusula USING. Você também pode usar a cláusula USING para especificar as subconsultas que identificam as linhas a serem removidas.

Se você especificar uma subconsulta, então coloque a subconsulta entre parênteses.

Se você especificar mais de uma tabela ou consulta, use uma vírgula para separá-las.

WHERE condition

Especifica uma condição a ser usada para selecionar as linhas a serem removidas. Se este parâmetro for omitido, todas as linhas da tabela são removidas, mas a tabela continua a existir.

Notas de uso

  • Ao excluir com base em um JOIN (especificando uma cláusula USING), é possível que uma linha na tabela de destino se junte a várias linhas na(s) tabela(s) USING. Se a condição DELETE for satisfeita para qualquer uma das combinações unidas, a linha de destino é excluída.

    Por exemplo, dadas as tabelas tab1 e tab2 com colunas (k number, v number):

    select * from tab1;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   10  |
    -------+-------+
    
    Select * from tab2;
    
    -------+-------+
       k   |   v   |
    -------+-------+
       0   |   20  |
       0   |   30  |
    -------+-------+
    
    Copy

    Se você executar a seguinte consulta, a linha em tab1 é unida contra ambas as linhas de tab2:

    DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k
    
    Copy

    Como pelo menos um par unido satisfaz a condição, a linha é excluída. Como resultado, após o término da instrução, tab1 está vazio.

Exemplos

Suponha que uma organização que aluga bicicletas utilize as seguintes tabelas:

  • A tabela chamada bicicletas_alugadas lista as bicicletas que foram alugadas.

  • A tabela com o nome de bicicletas devolvidas lista as bicicletas que foram devolvidas recentemente. Essas bicicletas precisam ser retiradas da tabela de bicicletas alugadas.

Criar tabelas:

CREATE TABLE leased_bicycles (bicycle_id INTEGER, customer_id INTEGER);
CREATE TABLE returned_bicycles (bicycle_id INTEGER);
Copy

Carregar dados:

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);
Copy

Este exemplo mostra como usar a cláusula WHERE para excluir uma linha(s) especificada(s). Este exemplo apaga por ID_bicicleta:

DELETE FROM leased_bicycles WHERE bicycle_ID = 105;
+------------------------+
| number of rows deleted |
|------------------------|
|                      1 |
+------------------------+
Copy

Mostrar os dados após a exclusão:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        102 |        2222 |
|        103 |        3333 |
|        104 |        4444 |
+------------+-------------+
Copy

Este exemplo mostra como usar a cláusula USING para especificar as linhas a serem excluídas. Esta cláusula USING especifica a tabela de bicicletas_devolvidas, que lista a IDs das bicicletas a serem excluídas da tabela de bicicletas_alugadas. A cláusula WHERE junta a tabela de bicicletas_alugadas à tabela de bicicletas_devolvidas, e as linhas em bicicletas_alugadas com a mesma ID_bicicleta que as linhas correspondentes em bicicletas_devolvidas são eliminadas.

BEGIN WORK;
DELETE FROM leased_bicycles 
    USING returned_bicycles
    WHERE leased_bicycles.bicycle_ID = returned_bicycles.bicycle_ID;
TRUNCATE TABLE returned_bicycles;
COMMIT WORK;
Copy

(Para evitar tentar remover as mesmas linhas novamente no futuro, quando pode ser desnecessário ou inadequado, a tabela de bicicletas devolvidas é truncada como parte da mesma transação).

Mostrar os dados após a exclusão:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
|        103 |        3333 |
+------------+-------------+
Copy

Agora suponha que outra(s) bicicleta(s) seja(m) devolvida(s):

INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
Copy

A consulta seguinte mostra uma cláusula USING que contém uma subconsulta (em vez de uma tabela) para especificar quais IDs_bicicleta devem ser removidos da tabela de bicicletas_alugadas:

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;
Copy

Mostrar os dados após a exclusão:

SELECT * FROM leased_bicycles ORDER BY bicycle_ID;
+------------+-------------+
| BICYCLE_ID | CUSTOMER_ID |
|------------+-------------|
|        101 |        1111 |
+------------+-------------+
Copy