¿GOTA SI EXISTE VS GOTA?

163

¿Alguien puede decirme si hay alguna diferencia entre

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Pregunto esto porque estoy usando la plantilla JDBC en mi aplicación web MVC. Si uso DROP [TABLE_NAME]el error dice que existe la tabla. Y si lo uso DROP IF EXISTS [TABLE_NAME]dice mala gramática SQL. ¿Alguien puede ayudar?

AbdulAziz
fuente
1
Si está buscando la gramática de SQL Server, está aquí: stackoverflow.com/questions/7887011/…
Drew Delano
Creo que esto debería tener una etiqueta en cuestión para qué base de datos específica.
Tom Stickel

Respuestas:

293

La sintaxis SQL estándar es

DROP TABLE table_name;

IF EXISTSno es estándar; diferentes plataformas pueden admitirlo con una sintaxis diferente, o no admitirlo en absoluto. En PostgreSQL, la sintaxis es

DROP TABLE IF EXISTS table_name;

El primero arrojará un error si la tabla no existe, o si otros objetos de la base de datos dependen de ella. Muy a menudo, los otros objetos de la base de datos serán referencias de claves foráneas, pero también puede haber otros. (Vistas, por ejemplo). El segundo no arrojará un error si la tabla no existe, pero aún arrojará un error si otros objetos de la base de datos dependen de ella.

Para soltar una tabla y todos los demás objetos que dependen de ella, use uno de estos.

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

Use CASCADE con mucho cuidado.

Mike Sherrill 'Retiro del gato'
fuente
66
Solo pensé en mencionar que sería una muy buena idea para uno usar CASCADEdentro de un bloque de transacciones ( BEGIN... COMMIT). De esta manera, queda claro cómo se verá afectada la base de datos antes de potencialmente bloquear una gran cantidad de datos que quizás no haya deseado.
jbowman
3
DROP IF EXISTS (sin CASCADE) también se agrega en SQL Server 2016. Ver blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT
35

No es lo que se pregunta directamente. Pero buscando cómo hacer correctamente las tablas desplegables, me topé con esta pregunta, como creo que muchos otros también.

Desde SQL Server 2016+ puedes usar

DROP TABLE IF EXISTS dbo.Table

Para SQL Server <2016, lo que hago es lo siguiente para una tabla permanente

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

O esto, para una mesa temporal

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

Olvidó el tableen su sintaxis:

drop table [table_name]

que deja caer una mesa

Utilizando

drop table if exists [table_name]

comprueba si la tabla existe antes de soltarla.
Si existe, se cae.
De lo contrario, no se generará ningún error y no se tomará ninguna medida.

juergen d
fuente
4
DROP TABLE IF EXISTS [table_name]

primero verifica si la tabla existe, si es así, elimina la tabla mientras

DROP TABLE [table_name]

se elimina sin verificar, por lo que si no existe, sale con un error

Flakron Bytyqi
fuente
3

Si no existe una tabla con ese nombre, DROPfalla con el error mientras DROP IF EXISTSsimplemente no hace nada.

Esto es útil si crea / modifica su base de datos con un script; de esta manera no tiene que asegurarse manualmente de que se eliminen las versiones anteriores de la tabla. Simplemente haz un DROP IF EXISTSy olvídate de eso.

Por supuesto, su motor de base de datos actual puede no admitir esta opción, es difícil decir más sobre el error con la información que proporciona.

SJuan76
fuente
También vale la pena mencionar que algunos RDBMS (PostgreSQL en particular) lanzan una advertencia si lo intenta drop some_table if exists;y la tabla some_tableno existe.
Ah, y por supuesto, juegen d y Flakron tienen razón. DROPnecesita que especifiques el tipo de objeto ( TABLEen este caso)
SJuan76