2012-03-05 8 views
102

Qualcuno può dirmi se c'è qualche differenza traGOCCIA SE GLI EXISTS DROP?

DROP IF EXISTS [TABLE_NAME] 
DROP [TABLE_NAME] 

Chiedo questo perché sto utilizzando template JDBC nella mia applicazione web MVC. Se utilizzo DROP [TABLE_NAME], l'errore indica che la tabella esiste. E se io uso DROP IF EXISTS [TABLE_NAME] dice una cattiva grammatica SQL. Qualcuno può aiutare?

+1

Se stai cercando la grammatica di SQL Server, è qui: http://stackoverflow.com/questions/78870 11/how-to-drop-a-table-if-it-exists-in-sql-server –

risposta

197
sintassi

standard SQL è

DROP TABLE table_name; 

IF EXISTS non è stan Dard; piattaforme diverse potrebbero supportarlo con una sintassi diversa o non supportarlo affatto. In PostgreSQL, la sintassi è

DROP TABLE IF EXISTS table_name; 

Il primo genera un errore se la tabella non esiste, o se altri oggetti di database dipendono da esso. Molto spesso, gli altri oggetti di database saranno riferimenti a chiavi esterne, ma potrebbero essercene anche altri. (Visualizzazioni, ad esempio.) Il secondo non genera un errore se la tabella non esiste, ma genera comunque un errore se altri oggetti database dipendono da esso.

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

Utilizzare CASCADE con molta cura.

+4

Ho solo pensato che sarebbe stata un'idea ** veramente ** ** buona ** per usare "CASCADE" all'interno di un blocco di transazione ('BEGIN' ...' COMMIT'). In questo modo è chiaro in che modo il database sarà interessato prima che potenzialmente clobbering un gruppo di dati che potresti non aver voluto. – jbowman

+1

DROP SE EXISTS (senza CASCADE) viene inoltre aggiunto in SQL Server 2016. Vedere http://blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/drop-if-exists-new-thing-in -SQL-server-2016.aspx –

14

hai dimenticato il table nella sintassi:

drop table [table_name] 

che scende un tavolo.

Utilizzando

drop table if exists [table_name] 

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

3

Se nessuna tabella con tale nome esiste, DROP non riesce con errore mentre DROP IF EXISTS non fa nulla.

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

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

+0

Potrebbe anche valere la pena ricordare che alcuni RDBMS (PostgreSQL in particolare) lanciano un avvertimento se si prova 'drop some_table se esiste; 'e la tabella' some_table' non esiste. –

+0

Ah, e ovviamente Juegen e Flakron hanno ragione. 'DROP' ha bisogno che tu specifichi il tipo di oggetto (' TABLE' in questo caso) – SJuan76

4
DROP TABLE IF EXISTS [table_name] 

controlla prima se la tabella esiste, se lo fa elimina la tabella mentre

DROP TABLE [table_name] 

elimina senza controllare, quindi se non esiste esce con un errore

23

Non è ciò che viene richiesto direttamente.Ma cercando come fare correttamente i drop tables, mi sono imbattuto in questa domanda, come immagino che anche molti altri lo facciano.

da SQL Server 2016+ è possibile utilizzare

DROP TABLE IF EXISTS dbo.Table 

Per SQL Server 2016 < quello che faccio è la seguente per un tavolo 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; 
Problemi correlati