DROP JIKA ADA VS DROP?


163

Dapatkah seseorang memberi tahu saya jika ada perbedaan di antara keduanya

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Saya menanyakan hal ini karena saya menggunakan template JDBC di aplikasi web MVC saya. Jika saya menggunakan DROP [TABLE_NAME]kesalahan mengatakan bahwa Table ada. Dan jika saya menggunakannya DROP IF EXISTS [TABLE_NAME]mengatakan tata bahasa SQL yang buruk. Bisakah seseorang membantu?


1
Jika Anda mencari tata bahasa SQL Server, ada di sini: stackoverflow.com/questions/7887011/…
Drew Delano

Saya pikir ini harus memiliki tag pada pertanyaan untuk database spesifik apa.
Tom Stickel

Jawaban:


293

Sintaks SQL standar adalah

DROP TABLE table_name;

IF EXISTSbukan standar; platform yang berbeda mungkin mendukungnya dengan sintaks yang berbeda, atau tidak mendukungnya sama sekali. Dalam PostgreSQL, sintaksnya adalah

DROP TABLE IF EXISTS table_name;

Yang pertama akan melempar kesalahan jika tabel tidak ada, atau jika objek database lain bergantung padanya. Paling sering, objek database lain akan menjadi referensi kunci asing, tetapi mungkin ada yang lain juga. (Tampilan, misalnya.) Yang kedua tidak akan melempar kesalahan jika tabel tidak ada, tetapi masih akan melempar kesalahan jika objek database lain bergantung padanya.

Untuk menjatuhkan tabel, dan semua objek lain yang bergantung padanya, gunakan salah satunya.

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

Gunakan CASCADE dengan sangat hati-hati.


6
Hanya berpikir saya akan menyebutkan bahwa itu akan menjadi ide yang sangat bagus untuk digunakan CASCADEdalam blok transaksi ( BEGIN... COMMIT). Dengan cara ini jelas bagaimana database akan terpengaruh sebelum berpotensi menghancurkan sekelompok data yang mungkin tidak Anda inginkan.
jbowman

3
DROP JIKA ADA (tanpa CASCADE) juga ditambahkan di SQL Server 2016. Lihat blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT

35

Bukan itu yang ditanyakan langsung. Tetapi mencari cara melakukan drop table dengan benar, saya menemukan pertanyaan ini, karena saya kira banyak orang lain juga melakukannya.

Dari SQL Server 2016+ Anda dapat menggunakan

DROP TABLE IF EXISTS dbo.Table

Untuk SQL Server <2016 yang saya lakukan adalah berikut ini untuk tabel permanen

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

Atau ini, untuk meja sementara

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

17

Anda lupa tablesintaksisnya:

drop table [table_name]

yang menjatuhkan meja.

Menggunakan

drop table if exists [table_name]

memeriksa apakah tabel ada sebelum menjatuhkannya.
Jika ada, itu akan jatuh.
Jika tidak, tidak ada kesalahan yang akan terjadi dan tidak ada tindakan yang dilakukan.


4
DROP TABLE IF EXISTS [table_name]

pertama-tama memeriksa apakah tabel ada, jika itu menghapus tabel sementara

DROP TABLE [table_name]

menghapus tanpa memeriksa, jadi jika tidak ada keluar dengan kesalahan


3

Jika tidak ada tabel dengan nama seperti itu, DROPgagal dengan kesalahan sementara DROP IF EXISTStidak melakukan apa-apa.

Ini berguna jika Anda membuat / memodifikasi database Anda dengan skrip; dengan cara ini Anda tidak perlu memastikan secara manual bahwa versi tabel sebelumnya dihapus. Anda hanya perlu melakukan DROP IF EXISTSdan melupakannya.

Tentu saja, mesin DB Anda saat ini mungkin tidak mendukung opsi ini, sulit untuk mengatakan lebih banyak tentang kesalahan dengan informasi yang Anda berikan.


Mungkin juga perlu disebutkan bahwa beberapa RDBMS (PostgreSQL khususnya) memberikan peringatan jika Anda mencoba drop some_table if exists;dan tabelnya some_tabletidak ada.

Ah, dan tentu saja juegen d dan Flakron benar. DROPperlu Anda menentukan jenis objek ( TABLEdalam hal ini)
SJuan76
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.