Este artigo contém SQL básico
DELETE
instruções que iniciantes podem usar para excluir dados de suas tabelas de banco de dados. Excluir uma única linha
Aqui está um exemplo básico do SQL
DELETE
demonstração. DELETE FROM Owners
WHERE OwnerId = 5;
Nesse caso, excluímos a linha onde o
OwnerId
coluna tem um valor de 4
. O
DELETE
A instrução começa com DELETE FROM
, seguido pelo nome da tabela (ou seja, a tabela que contém os dados que você deseja excluir). Em alguns sistemas de gerenciamento de banco de dados (SGBDs), o
FROM
palavra-chave é opcional, mas é uma boa ideia incluí-la para melhor portabilidade (caso você precise executar o mesmo código em um DBMS diferente). Você deve sempre incluir um
WHERE
cláusula, a menos que você queira excluir todas as linhas da tabela. Sim, você leu certo. Omitindo o
WHERE
cláusula excluirá todas as linhas da tabela. A maioria dos DBMSs tem várias outras opções que você pode usar com o
DELETE
declaração, mas os listados aqui são os mais comumente usados. Observe que o
DELETE
instrução exclui a linha inteira. Você não pode excluir o valor de uma coluna individual em uma linha. Para fazer isso, use o SQL UPDATE
demonstração. Exemplo
Neste exemplo, excluímos dados de uma tabela.
Antes de mais nada, vamos ver o que está na tabela.
SELECT * FROM Owners;
Resultado:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
OK, vamos excluir o proprietário número 5 e, em seguida, selecione a tabela novamente.
DELETE FROM Owners
WHERE OwnerId = 5;
SELECT * FROM Owners;
Resultado:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Stallone | (489) 591-0408 | NULL | | 4 | Boris | Biden | (349) 611-8908 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Podemos ver que a última linha foi excluída conforme especificado.
Chaves estrangeiras
Você pode receber um erro se tentar excluir dados referenciados por uma chave estrangeira em outra tabela. Isso ocorre porque a tabela da qual você está tentando excluir dados é a tabela pai em um relacionamento. A tabela com a chave estrangeira (a tabela filha) depende dos dados da tabela pai (ou seja, dados que você está tentando excluir).
Se você receberá um erro ou não, dependerá de como a chave estrangeira foi configurada. A maioria dos DBMSs oferece suporte a várias opções para lidar com essa situação. Essas opções podem incluir, gerar um erro, cascatear a exclusão para a tabela de chave estrangeira (ou seja, excluir a linha da tabela filha), definir a chave estrangeira como
NULL
, ou definindo-o para seu valor padrão. Aqui está um exemplo de tentativa de excluir uma linha referenciada por uma chave estrangeira.
DELETE FROM Owners
WHERE OwnerId = 3;
Resultado:
Msg 547, Level 16, State 0, Line 1 The DELETE statement conflicted with the REFERENCE constraint "FK_Pets_Owners". The conflict occurred in database "PetHotel", table "dbo.Pets", column 'OwnerId'. The statement has been terminated.
Nesse caso, um erro foi gerado e a linha não foi excluída.
Neste exemplo, o
Owners.OwnerId
coluna é a chave primária desta tabela. Outra tabela chamada Pets
tem um OwnerId
coluna que faz referência a essa coluna de chave primária e, nesse caso, há pelo menos uma linha que faz referência ao proprietário número 3. Se eu realmente quisesse excluir essa linha, precisaria atualizar os dados na tabela filha para que nenhuma linha aponte para esse proprietário. Ou isso, ou modifique a chave estrangeira para que ela use uma opção diferente quando ocorrerem operações de exclusão na chave primária. Modificar uma chave estrangeira pode ser uma opção indesejável, dependendo do que você precisa fazer. Dependendo do seu DBMS, também pode ser necessário descartar a chave existente e recriá-la.
De qualquer forma, esse erro é bom, porque nos alerta para um problema que teremos se excluirmos essa linha. Ajuda a reforçar a integridade referencial.
Cuidado! Esquecendo o WHERE
Cláusula
O
DELETE
declaração pode ser uma declaração muito perigosa. Se você omitir o WHERE
cláusula, você excluirá todos linhas na tabela. Felizmente, você pode ser salvo por restrições de chave estrangeira se tentar excluir dados da tabela pai de um relacionamento.
Mas e se não for. E se nenhum erro for gerado por suas instruções de exclusão?
Vamos descobrir!
Vamos executar outro
DELETE
declaração, mas desta vez vamos esquecer de incluir o WHERE
cláusula. Além disso, desta vez vamos executá-lo em uma tabela que não é pai em um relacionamento. Primeiro, vamos ver o que está na tabela.
SELECT * FROM Pets;
Resultado:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
OK, então temos oito animais de estimação. Na verdade, podemos ver que três animais de estimação pertencem ao proprietário número 3 – o proprietário que tentamos excluir no exemplo anterior. É por isso que recebemos o erro.
De qualquer forma, vamos executar nosso
DELETE
declaração sem o WHERE
cláusula e, em seguida, verifique a tabela novamente DELETE FROM Pets;
SELECT * FROM Pets;
Resultado:
(8 rows affected) (0 rows affected)
O
(8 rows affected)
parte significa que oito linhas foram excluídas. O
(0 rows affected)
parte significa que nenhuma linha foi selecionada (porque não há linhas na tabela. Ops!
Pode haver momentos em que você realmente precise excluir todas as linhas da tabela. Dependendo do tamanho da mesa, esta declaração será tudo que você precisa.
Se você precisar excluir uma tabela maior, também há
TRUNCATE TABLE
, que remove todas as linhas de uma tabela ou partições especificadas de uma tabela, sem registrar as exclusões de linhas individuais (o DELETE
declaração registra essas exclusões). Portanto,
TRUNCATE TABLE
é mais rápido e usa menos recursos do sistema e do log de transações. Exemplo de uso de
TRUNCATE TABLE
:TRUNCATE TABLE Owners;
Observe que isso pode não funcionar se a tabela estiver sendo referenciada por uma restrição de chave estrangeira, mesmo se não houver linhas filhas. Nesses casos,
DELETE
pode funcionar em vez disso.