Em SQL, se você deseja remover uma tabela de um banco de dados, você precisa usar o
DROP TABLE
demonstração. Isso destrói a tabela e todos os seus dados.
Sintaxe
A sintaxe padrão do SQL é assim:
DROP TABLE <table name> <drop behavior>
Onde:
<table name>
é o nome da tabela que você deseja eliminar.<drop behavior>
especifica quaisquer opções. Estes podem serCASCADE
ouRESTRICT
.
Alguns RDBMSs também aceitam um opcional
IF EXISTS
argumento que significa que não retornará um erro se a tabela não existir. Alguns RDBMSs (como MySQL e MariaDB) também aceitam um opcional
TEMPORARY
palavra-chave para garantir que apenas as tabelas temporárias sejam eliminadas. A Oracle também aceita um
PURGE
cláusula, que o limpa da lixeira. Exemplo
Aqui está um exemplo para demonstrar.
DROP TABLE t1;
A execução desse código elimina a tabela chamada
t1
e todos os seus dados. O IF EXISTS
Cláusula
Aqui está um exemplo de uso do
IF EXISTS
cláusula para verificar se a tabela já existe. DROP TABLE IF EXISTS t1;
Usando
IF EXISTS
garante que não receberemos um erro se a tabela não existir. Veja o que acontece se removermos
IF EXISTS
da declaração:DROP TABLE t1;
Resultado:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't1', because it does not exist or you do not have permission.
Essa é a mensagem retornada pelo SQL Server. Sua mensagem dependerá do DBMS que você está usando.
Chaves e visualizações estrangeiras dependentes
Alguns RDBMSs permitem um opcional
RESTRICT
ou CASCADE
palavra-chave que especifica o que acontece se a tabela tiver quaisquer chaves estrangeiras ou visualizações que façam referência a ela. O RESTRICT
Opção
Aqui está um exemplo de uso de
RESTRICT
ao tentar descartar uma tabela referenciada por uma chave estrangeira em outra tabela:DROP TABLE t1 RESTRICT;
Resultado:
cannot drop table t1 because other objects depend on it
Este exemplo foi feito usando PostgreSQL.
RESTRICT
é a opção padrão, então teríamos recebido o mesmo resultado mesmo se não tivéssemos incluído o RESTRICT
palavra-chave. A CASCADE
Opção
Veja o que acontece se mudarmos para
CASCADE
ao tentar descartar a mesma tabela (que é referenciada por uma chave estrangeira em outra tabela):DROP TABLE t1 CASCADE;
Resultado:
NOTICE: drop cascades to constraint t2_c2_fkey on table t2 Commands completed successfully
Isso descartou a chave estrangeira que fazia referência ao nosso
t1
tabela. A chave estrangeira foi chamada t2_c2_fkey
. Observe que não descartou a tabela que tinha a chave estrangeira. Ele apenas descartou a chave estrangeira.
Se a tabela de destino (
t1
) fosse referenciado por quaisquer visualizações, a visualização inteira teria sido descartada. Você não precisa especificar
CASCADE
para eliminar quaisquer índices, regras, gatilhos ou restrições que existam para a tabela de destino. Eles são descartados automaticamente, mesmo ao usar a opção padrão (RESTRICT
). MySQL e MariaDB
Alguns DBMSs (como MySQL e MariaDB) aceitam o
RESTRICT
e CASCADE
palavras-chave, mas eles não fazem nada. Eles são fornecidos simplesmente para facilitar a portabilidade entre DBMSs. Oráculo
Oracle tem uma sintaxe ligeiramente diferente,
CASCADE CONSTRAINTS
, que descarta todas as restrições de integridade referencial que se referem a chaves primárias e exclusivas na tabela descartada. SQL Server
SQL Server não suporta o
CASCADE
ou RESTRICT
palavras-chave. Se a tabela tiver alguma dependência de chave estrangeira, você precisará eliminá-la antes de descartar a tabela, caso contrário, você receberá um erro. No entanto, no SQL Server, você pode descartar uma tabela mesmo que ela seja referenciada por uma exibição ou procedimento armazenado. Portanto, você deve verificar essas referências e excluí-las explicitamente usando
DROP VIEW
ou DROP PROCEDURE
. SQLite
SQLite não suporta o
CASCADE
ou RESTRICT
palavras-chave. Se a tabela de destino for referenciada por qualquer exibição, a tabela ainda será descartada (e a exibição permanecerá).
Se a tabela de destino for referenciada por qualquer chave estrangeira, o resultado dependerá se você tem chaves estrangeiras habilitadas e, em caso afirmativo, se há algum dado na tabela filha e, em caso afirmativo, se a chave estrangeira está ou não definida com
ON DELETE CASCADE
. Se você usa SQLite, veja SQLite
DROP TABLE
para um exemplo e discussão sobre como descartar uma tabela referenciada por uma chave estrangeira. Retirar várias tabelas
Alguns RDBMSs permitem que você remova várias tabelas de um único
DROP TABLE
demonstração. Exemplo:
DROP TABLE t11, t12;
Os RDBMSs que suportam essa sintaxe incluem SQL Server, MySQL, MariaDB e PostgreSQL.
No entanto, se você estiver descartando uma tabela referenciada por uma chave estrangeira e essa chave estrangeira impedir que ela seja descartada, será necessário listar a tabela filha antes da tabela pai.
Por exemplo, se eu executar a instrução acima no SQL Server, recebo o seguinte erro:
Msg 3726, Level 16, State 1, Line 1 Could not drop object 't11' because it is referenced by a FOREIGN KEY constraint.
Nesse caso, posso simplesmente mudar a ordem das tabelas no meu
DROP TABLE
demonstração:DROP TABLE t12, t11;
Na verdade, neste caso, recebi outro erro dizendo que
t12
não existe. Aqui está o que eu tenho:
Msg 3701, Level 11, State 5, Line 1 Cannot drop the table 't12', because it does not exist or you do not have permission.
Isso ocorre porque, mesmo que a instrução anterior não pudesse eliminar
t11
, foi de fato bem-sucedido em descartar t12
. E, como uma comédia de erros, desta vez conseguiu eliminar
t11
mas não t12
. Independentemente disso, ambas as tabelas foram agora descartadas.
Mas se você acertar o pedido na primeira vez, você deve receber uma mensagem como esta:
Commands completed successfully.
A palavra-chave TEMPORÁRIA
Alguns RDBMSs (como MySQL e MariaDB) aceitam um
TEMPORARY
palavra-chave. Ele vai entre
DROP
e TABLE
, assim:DROP TEMPORARY TABLE t1;
Usando o
TEMPORARY
A palavra-chave garantirá que você não descarte acidentalmente uma tabela não temporária ao tentar descartar uma tabela temporária. O
TEMPORARY
palavra-chave tem os seguintes efeitos:- A instrução descarta apenas
TEMPORARY
tabelas. - A instrução não causa um commit implícito (usando
DROP TABLE
sem oTEMPORARY
palavra-chave confirma automaticamente a transação ativa atual). - Nenhum direito de acesso é verificado. Um
TEMPORARY
A tabela é visível apenas com a sessão que a criou, portanto, nenhuma verificação é necessária.
A Cláusula de Purga
Oracle tem um opcional
PURGE
cláusula, que você pode usar se quiser descartar a tabela e liberar o espaço associado a ela em uma única etapa. Se você especificar PURGE
, o banco de dados não colocará a tabela e seus objetos dependentes na lixeira. Isso equivale a primeiro descartar a tabela e depois removê-la da lixeira, mas permite que você salve uma etapa do processo.
Observe que se você especificar
PURGE
, você não poderá recuperar a tabela. Se você não especificar
PURGE
, o DROP
TABLE
não resulta na liberação de espaço de volta para o tablespace para uso por outros objetos, e o espaço continua a contar para a cota de espaço do usuário.