DELETE — exclui linhas de uma tabela
[ WITH [ RECURSIVE ]consulta_WITH[, ...] ] DELETE FROM [ ONLY ]nome_da_tabela[ * ] [ [ AS ]alias] [ USINGitem_FROM[, ...] ] [ WHEREcondição| WHERE CURRENT OFnome_do_cursor] [ RETURNING [ WITH ( { OLD | NEW } ASalias_de_saída[, ...] ) ] { * |expressão_de_saída[ [ AS ]nome_de_saída] } [, ...] ]
O comando DELETE exclui as linhas que atendem à
cláusula WHERE da tabela especificada.
Se a cláusula WHERE estiver ausente, o efeito
será excluir todas as linhas da tabela.
O resultado será uma tabela válida, mas vazia.
O comando TRUNCATE fornece um mecanismo mais rápido para remover todas as linhas de uma tabela.
Existem duas maneiras de excluir linhas em uma tabela usando
informações contidas em outras tabelas no banco de dados:
usando sub-seleções, ou especificando tabelas adicionais na cláusula
USING.
Qual técnica é a mais apropriada depende das circunstâncias
específicas.
A cláusula opcional RETURNING faz com que o comando
DELETE calcule e retorne valores com base em cada
linha realmente excluída.
Pode ser computada qualquer expressão usando as colunas da tabela,
e/ou colunas de outras tabelas mencionadas na cláusula
USING.
A sintaxe da lista da cláusula RETURNING é
idêntica à da lista de saída do comando SELECT.
É necessário ter o privilégio DELETE na tabela
para excluir suas linhas, bem como o privilégio
SELECT para qualquer tabela na cláusula
USING, ou cujos valores sejam lidos pela
condição.
consulta_WITH
A cláusula WITH permite especificar uma ou mais
subconsultas que podem ser referenciadas por nome no comando
DELETE.
Veja Consultas WITH (Expressões de tabela comuns) e SELECT
para obter detalhes.
nome_da_tabela
O nome (opcionalmente qualificado pelo esquema) da tabela na qual
as linhas serão excluídas.
Se for especificado ONLY antes do nome da tabela,
serão excluídas as linhas correspondentes apenas da tabela indicada.
Se não for especificado ONLY, também serão
excluídas as linhas correspondentes de quaisquer tabelas
descendentes da tabela indicada.
Como opção, pode ser especificado um * após o
nome da tabela, para indicar explicitamente que as tabelas
descendentes estão incluídas.
alias
Um nome substituto para o
nome_da_tabela.
Quando é fornecido um alias, este oculta completamente o nome
real da tabela.
Por exemplo, dado o comando DELETE FROM foo AS f,
o restante do comando DELETE deve referir-se a
esta tabela como f, e não como
foo.
item_FROM
Uma expressão de tabela permitindo que colunas de outras tabelas
apareçam na condição WHERE.
É usada a mesma sintaxe da Cláusula FROM do comando
SELECT; por exemplo, pode ser especificado
um alias para o nome da tabela.
Não deve ser repetida a tabela indicada como um
item_FROM,
a menos que se deseje configurar uma autojunção
(neste caso, ela deve aparecer com um alias no
item_FROM).
condição
Uma expressão que retorna um valor do tipo de dados
boolean.
Apenas as linhas para as quais esta expressão retorna
true serão excluídas.
nome_do_cursor
O nome do cursor a ser usado na condição
WHERE CURRENT OF.
A linha a ser excluída é a mais recente obtida por este cursor.
O cursor deve ser de uma consulta sem agrupamento na tabela
indicada no comando DELETE.
Note que WHERE CURRENT OF não pode ser
especificado junto com uma condição booleana.
Veja DECLARE para obter mais informações
sobre como usar cursores com WHERE CURRENT OF.
alias_de_saída
Um nome substituto opcional para as linhas OLD
ou NEW na lista RETURNING.
Por padrão, os valores antigos da tabela de destino podem ser
retornados escrevendo
OLD.
ou nome_da_colunaOLD.*, e os novos valores podem ser
retornados escrevendo
NEW.
ou nome_da_colunaNEW.*.
Quando é fornecido um alias, estes nomes ficam ocultos e as linhas
antigas ou novas devem ser referenciadas usando o alias.
Por exemplo
RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.
expressão_de_saída
Uma expressão a ser computada e retornada pelo comando
DELETE após cada linha ser excluída.
A expressão pode usar quaisquer nomes de coluna da tabela indicada
por nome_da_tabela,
ou da(s) tabela(s) listada(s) na cláusula USING.
Deve ser escrito * para retornar todas as colunas.
Um nome de coluna ou um * pode ser qualificado
usando OLD ou NEW, ou o
alias_de_saída
correspondente para OLD ou NEW,
para que valores antigos ou novos sejam retornados.
Um nome de coluna não qualificado, ou *,
ou um nome de coluna ou * qualificado usando
o nome ou alias da tabela de destino retornará valores antigos.
Para um comando DELETE simples, todos os novos
valores serão NULL.
Entretanto, se uma regra ON DELETE fizer com
que um INSERT ou UPDATE
seja executado em seu lugar, os novos valores podem não ser
NULL.
nome_de_saídaO nome a ser usado para a coluna retornada.
Após a conclusão bem-sucedida, o comando DELETE
retorna uma etiqueta de comando na forma
DELETE contador
O contador é o número
de linhas excluídas.
Note que o número pode ser menor que o número de linhas que
corresponderam à condição,
quando exclusões forem suprimidas por um gatilho
BEFORE DELETE.
Se o contador for igual a 0,
nenhuma linha foi excluída pelo comando (isto não é considerado um erro).
Se o comando DELETE contiver uma cláusula
RETURNING, o resultado será semelhante ao de um
comando SELECT contendo as colunas e valores
definidos na lista da cláusula RETURNING,
computadas sobre a(s) linha(s) excluída(s) pelo comando.
O PostgreSQL permite referenciar colunas
de outras tabelas na condição WHERE, especificando
as outras tabelas na cláusula USING.
Por exemplo, para excluir todos os filmes produzidos por um
determinado produtor, pode-se executar:
DELETE FROM films USING producers WHERE producer_id = producers.id AND producers.name = 'foo';
O que está essencialmente acontecendo aqui é uma junção entre as tabelas
films e producers,
com todas as linhas de films juntadas com
sucesso sendo marcadas para exclusão.
Esta sintaxe não é padrão.
Uma maneira mais de acordo com o padrão de fazer isto é:
DELETE FROM films WHERE producer_id IN (SELECT id FROM producers WHERE name = 'foo');
Em alguns casos, o estilo junção é mais fácil de escrever ou mais rápido de executar do que o estilo subseleção.
Excluir todos os filmes, exceto os musicais:
DELETE FROM films WHERE kind <> 'Musical';
Limpar a tabela films:
DELETE FROM films;
Excluir as tarefas concluídas, retornando os detalhes completos das linhas excluídas:
DELETE FROM tasks WHERE status = 'DONE' RETURNING *;
Excluir a linha da tabela tasks onde o
cursor c_tasks está posicionado no momento:
DELETE FROM tasks WHERE CURRENT OF c_tasks;
Embora não exista uma cláusula LIMIT no comando
DELETE, é possível obter um efeito semelhante
usando o mesmo método descrito em Exemplo de limite de atualizações
na documentação do comando UPDATE.
WITH delete_batch AS (
SELECT l.ctid FROM user_logs AS l
WHERE l.status = 'archived'
ORDER BY l.creation_date
FOR UPDATE
LIMIT 10000
)
DELETE FROM user_logs AS dl
USING delete_batch AS del
WHERE dl.ctid = del.ctid;
Este comando está em conformidade com o padrão SQL,
exceto que as cláusulas USING e
RETURNING são extensões do
PostgreSQL, assim como a capacidade de
usar WITH com DELETE.