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> ]
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
etab2
com colunas(k number, v number)
:select * from tab1; -------+-------+ k | v | -------+-------+ 0 | 10 | -------+-------+ Select * from tab2; -------+-------+ k | v | -------+-------+ 0 | 20 | 0 | 30 | -------+-------+
Se você executar a seguinte consulta, a linha em
tab1
é unida contra ambas as linhas detab2
:DELETE FROM tab1 USING tab2 WHERE tab1.k = tab2.k
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);
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);
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 | +------------------------+
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 | +------------+-------------+
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;
(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 | +------------+-------------+
Agora suponha que outra(s) bicicleta(s) seja(m) devolvida(s):
INSERT INTO returned_bicycles (bicycle_ID) VALUES (103);
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;
Mostrar os dados após a exclusão:
SELECT * FROM leased_bicycles ORDER BY bicycle_ID; +------------+-------------+ | BICYCLE_ID | CUSTOMER_ID | |------------+-------------| | 101 | 1111 | +------------+-------------+