DELETE

DELETE — exclui linhas de uma tabela

Sinopse

[ WITH [ RECURSIVE ] consulta_WITH [, ...] ]
DELETE FROM [ ONLY ] nome_da_tabela [ * ] [ [ AS ] alias ]
    [ USING item_FROM [, ...] ]
    [ WHERE condição | WHERE CURRENT OF nome_do_cursor ]
    [ RETURNING * | expressão_de_saída [ [ AS ] nome_de_saída ] [, ...] ]

Descrição

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.

Dica

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.

Parâmetros

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.

Saídas

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.

Notas

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.

Exemplos

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.


Compatibilidade

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.

Veja também

TRUNCATE