DROP SE ESISTE CONTRO DROP?


163

Qualcuno può dirmi se c'è qualche differenza tra

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Lo sto chiedendo perché sto usando il modello JDBC nella mia applicazione Web MVC. Se uso DROP [TABLE_NAME]l'errore ho detto che esiste la tabella. E se lo uso DROP IF EXISTS [TABLE_NAME]dice cattiva grammatica SQL. Qualcuno può aiutare?


1
Se stai cercando la grammatica di SQL Server, è qui: stackoverflow.com/questions/7887011/…
Drew Delano,

Penso che questo dovrebbe avere un tag in questione per quale specifico database.
Tom Stickel,

Risposte:


293

La sintassi SQL standard è

DROP TABLE table_name;

IF EXISTSnon è standard; piattaforme diverse potrebbero supportarlo con sintassi diversa o non supportarlo affatto. In PostgreSQL, la sintassi è

DROP TABLE IF EXISTS table_name;

Il primo genererà un errore se la tabella non esiste o se altri oggetti del database dipendono da essa. Molto spesso, gli altri oggetti del database saranno riferimenti a chiave esterna, ma potrebbero essercene anche altri. (Visualizzazioni, ad esempio.) Il secondo non genererà un errore se la tabella non esiste, ma genererà comunque un errore se altri oggetti del database dipendono da esso.

Per eliminare una tabella e tutti gli altri oggetti che dipendono da essa, utilizzare uno di questi.

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

Usa CASCADE con grande cura.


6
Ho pensato di menzionare che sarebbe davvero una buona idea usare CASCADEuno all'interno di un blocco di transazioni ( BEGIN... COMMIT). In questo modo è chiaro come verrà influenzato il database prima che potenzialmente si blocchi un mucchio di dati che potresti non aver voluto.
jbowman,

3
DROP IF EXISTS (senza CASCADE) viene aggiunto anche in SQL Server 2016. Vedi blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT,

35

Non è ciò che viene chiesto direttamente. Ma cercando come far cadere correttamente le tabelle, mi sono imbattuto in questa domanda, come immagino che facciano anche molti altri.

Da SQL Server 2016+ è possibile utilizzare

DROP TABLE IF EXISTS dbo.Table

Per SQL Server <2016 quello che faccio è il seguente per una tabella permanente

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

O questo, per una tabella temporanea

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

17

Hai dimenticato il tablenella tua sintassi:

drop table [table_name]

che lascia cadere un tavolo.

utilizzando

drop table if exists [table_name]

controlla se la tabella esiste prima di eliminarla.
Se esiste, viene eliminato.
In caso contrario, non verrà generato alcun errore e non verrà intrapresa alcuna azione.


4
DROP TABLE IF EXISTS [table_name]

controlla innanzitutto se la tabella esiste, se lo fa elimina la tabella while

DROP TABLE [table_name]

si elimina senza controllo, quindi se non esiste si esce con un errore


3

Se non esiste una tabella con tale nome, DROPnon riesce con errore mentre DROP IF EXISTSnon fa nulla.

Ciò è utile se si crea / modifica il database con uno script; in questo modo non è necessario assicurarsi che vengano eliminate manualmente le versioni precedenti della tabella. Basta fare un DROP IF EXISTSe non pensarci più.

Naturalmente, l'attuale motore DB potrebbe non supportare questa opzione, è difficile dire di più sull'errore con le informazioni fornite.


Vale anche la pena ricordare che alcuni RDBMS (in particolare PostgreSQL) generano un avviso se si tenta drop some_table if exists;e la tabella some_tablenon esiste.

Ah, e ovviamente juegen de Flakron hanno ragione. DROPdevi specificare il tipo di oggetto ( TABLEin questo caso)
SJuan76
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.