GOTA SE EXISTE VS GOTA?


163

Alguém pode me dizer se existe alguma diferença entre

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Estou perguntando isso porque estou usando o modelo JDBC no meu aplicativo da web MVC. Se eu usar DROP [TABLE_NAME]o erro disse que a tabela existe. E se eu usá- DROP IF EXISTS [TABLE_NAME]lo diz gramática SQL ruim. Alguém pode ajudar?


1
Se você está procurando a gramática SQL Server, é aqui: stackoverflow.com/questions/7887011/...
de Drew Delano

Eu acho que isso deve ter uma marca em questão para o banco de dados específico.
quer

Respostas:


293

A sintaxe padrão do SQL é

DROP TABLE table_name;

IF EXISTSnão é padrão; plataformas diferentes podem suportá-lo com sintaxe diferente ou não suportá-lo. No PostgreSQL, a sintaxe é

DROP TABLE IF EXISTS table_name;

O primeiro lançará um erro se a tabela não existir ou se outros objetos de banco de dados dependerem dela. Na maioria das vezes, os outros objetos de banco de dados serão referências de chave estrangeira, mas também pode haver outros. (Visualizações, por exemplo.) O segundo não emitirá um erro se a tabela não existir, mas ainda emitirá um erro se outros objetos de banco de dados dependerem dela.

Para soltar uma tabela e todos os outros objetos que dependem dela, use um deles.

DROP TABLE table_name CASCADE;
DROP TABLE IF EXISTS table_name CASCADE;

Use CASCADE com muito cuidado.


6
Só pensei em mencionar que seria realmente uma boa ideia usar CASCADEdentro de um bloco de transação ( BEGIN... COMMIT). Dessa forma, fica claro como o banco de dados será afetado antes de potencialmente sobrecarregar um monte de dados que você talvez não desejasse.
jbowman

3
DROP IF EXISTS (sem CASCADE) também é adicionado no SQL Server 2016. Consulte blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT

35

Não é o que é pedido diretamente. Mas, procurando como descartar tabelas adequadamente, deparei-me com essa pergunta, como acho que muitas outras também.

No SQL Server 2016 ou superior, você pode usar

DROP TABLE IF EXISTS dbo.Table

Para SQL Server <2016, o que faço é o seguinte para uma tabela permanente

IF OBJECT_ID('dbo.Table', 'U') IS NOT NULL 
  DROP TABLE dbo.Table; 

Ou isso, para uma tabela temporária

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

17

Você esqueceu a tablesintaxe:

drop table [table_name]

que deixa cair uma mesa.

Usando

drop table if exists [table_name]

verifica se a tabela existe antes de descartá-la.
Se existir, será descartado.
Caso contrário, nenhum erro será gerado e nenhuma ação será tomada.


4
DROP TABLE IF EXISTS [table_name]

primeiro verifica se a tabela existe, se exclui a tabela enquanto

DROP TABLE [table_name]

ele exclui sem verificar, portanto, se não existe, sai com um erro


3

Se não existir uma tabela com esse nome, DROPfalhará com o erro e DROP IF EXISTSsimplesmente não fará nada.

Isso é útil se você criar / modificar seu banco de dados com um script; dessa forma, você não precisa garantir manualmente que as versões anteriores da tabela sejam excluídas. Você apenas faz um DROP IF EXISTSe esquece.

Obviamente, seu mecanismo de banco de dados atual pode não suportar essa opção; é difícil informar mais sobre o erro com as informações fornecidas.


Também vale a pena mencionar que alguns RDBMSs (PostgreSQL em particular) emitem um aviso se você tentar drop some_table if exists;e a tabela some_tablenão existir.

Ah, e claro, juegen de Flakron estão certos. DROPprecisa que você especificar o tipo de objeto ( TABLEneste caso)
SJuan76
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.