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 * |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
essa 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
(nesse 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 essa 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 esse 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
.
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 qualquer nome de coluna da tabela indicada
por nome_da_tabela
,
ou tabela(s) listada(s) na cláusula USING
.
Deve ser escrito *
para retornar todas as colunas.
nome_de_saída
O 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 (isso 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.
Essa sintaxe não é padrão.
Uma maneira mais de acordo com o padrão de fazer isso é:
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;
Exemplo 113. Comando DELETE utilizando USING, RETURNING e WHERE
Esse exemplo utiliza o nome do produtor armazenado na tabela
produtores
para excluir todos os filmes
desse produtor da tabela filmes
.
Abaixo está mostrado o arquivo filmes.sql
utilizado para criar e preencher as tabelas, e executar o comando
DELETE
:
DROP TABLE IF EXISTS produtores; DROP TABLE IF EXISTS filmes; CREATE TABLE produtores ( id_produtor INT PRIMARY KEY, nome TEXT ); INSERT INTO produtores VALUES (1,'faa'); INSERT INTO produtores VALUES (2,'fee'); INSERT INTO produtores VALUES (3,'fii'); INSERT INTO produtores VALUES (4,'foo'); INSERT INTO produtores VALUES (5,'fuu'); CREATE TABLE filmes ( id_filme INT PRIMARY KEY, titulo TEXT, id_produtor INT ); INSERT INTO filmes VALUES (1,'Lorem ipsum dolor',1); INSERT INTO filmes VALUES (2,'Pretium nibh ipsum',2); INSERT INTO filmes VALUES (3,'Odio ut sem nulla',3); INSERT INTO filmes VALUES (4,'Dignissim convallis',4); INSERT INTO filmes VALUES (5,'Erat velit scelerisquer.',4); INSERT INTO filmes VALUES (6,'Diam sit amet nisl',5); \pset border 2 \pset title 'Linhas excluídas' DELETE FROM filmes USING produtores WHERE filmes.id_produtor = produtores.id_produtor AND produtores.nome = 'foo' RETURNING *; \pset title 'Linhas remanescentes' SELECT * FROM filmes;
A seguir está mostrado o resultado do processamento do arquivo:
$ psql --file=filmes.sql ... Title is "Linhas excluídas". Linhas excluídas +----------+--------------------------+-------------+-------------+------+ | id_filme | titulo | id_produtor | id_produtor | nome | +----------+--------------------------+-------------+-------------+------+ | 4 | Dignissim convallis | 4 | 4 | foo | | 5 | Erat velit scelerisquer. | 4 | 4 | foo | +----------+--------------------------+-------------+-------------+------+ (2 rows) DELETE 2 Title is "Linhas remanescentes". Linhas remanescentes +----------+--------------------+-------------+ | id_filme | titulo | id_produtor | +----------+--------------------+-------------+ | 1 | Lorem ipsum dolor | 1 | | 2 | Pretium nibh ipsum | 2 | | 3 | Odio ut sem nulla | 3 | | 6 | Diam sit amet nisl | 5 | +----------+--------------------+-------------+ (4 rows)
Nota: Exemplo escrito pelo tradutor, não fazendo parte da documentação original.
Esse 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
.