DROP ЕСЛИ СУЩЕСТВУЕТ ПРОТИВ DROP

163

Может кто-нибудь сказать мне, если есть какая-либо разница между

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

Я спрашиваю об этом, потому что я использую шаблон JDBC в своем веб-приложении MVC. Если я использую DROP [TABLE_NAME]ошибку сказал, что таблица существует. И если я использую DROP IF EXISTS [TABLE_NAME]это говорит плохая грамматика SQL. Может кто-нибудь помочь?

Абдулазиз
источник
1
Если вы ищете грамматику SQL Server, она находится здесь: stackoverflow.com/questions/7887011/…
Дрю Делано,
Я думаю, что это должно иметь тег на вопрос для какой конкретной базы данных.
Том Стиккель

Ответы:

293

Стандартный синтаксис SQL

DROP TABLE table_name;

IF EXISTSне является стандартным; разные платформы могут поддерживать его с разным синтаксисом или вообще не поддерживать его. В PostgreSQL синтаксис

DROP TABLE IF EXISTS table_name;

Первый вызовет ошибку, если таблица не существует или если другие объекты базы данных зависят от нее. Чаще всего другие объекты базы данных будут ссылками на внешние ключи, но могут быть и другие. (Представления, например.) Вторая не выдаст ошибку, если таблица не существует, но все равно выдаст ошибку, если от нее зависят другие объекты базы данных.

Чтобы удалить таблицу и все другие объекты, которые от нее зависят, используйте один из них.

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

Используйте CASCADE с большой осторожностью.

Майк Шеррилл 'Cat Recall'
источник
6
Просто подумал, что упомяну, что было бы очень полезно использовать его CASCADEвнутри блока транзакции ( BEGIN... COMMIT). Таким образом, становится ясно, как база данных будет затронута перед тем, как вы, возможно, захотите скопить кучу данных, которые вы, возможно, не хотели.
Jbowman
3
DROP IF EXISTS (без CASCADE) также добавлен в SQL Server 2016. См. Blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/…
Jovan MSFT
35

Это не то, что спрашивается напрямую. Но, глядя на то, как правильно делать отбрасывание таблиц, я наткнулся на этот вопрос, как и многие другие.

С SQL Server 2016+ вы можете использовать

DROP TABLE IF EXISTS dbo.Table

Для SQL Server <2016 я делаю следующее для постоянной таблицы

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

Или это, для временного стола

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 
Squazz
источник
17

Вы забыли tableв своем синтаксисе:

drop table [table_name]

который опускает стол.

С помощью

drop table if exists [table_name]

проверяет, существует ли таблица, прежде чем ее отбросить.
Если оно существует, оно отбрасывается.
В противном случае не будет выдано никакой ошибки и не будет предпринято никаких действий.

Юрген д
источник
4
DROP TABLE IF EXISTS [table_name]

сначала он проверяет, существует ли таблица, удаляет ли она

DROP TABLE [table_name]

он удаляется без проверки, поэтому, если он не существует, он выходит с ошибкой

Flakron Bytyqi
источник
3

Если таблица с таким именем не существует, происходит DROPсбой с ошибкой, DROP IF EXISTSно ничего не происходит.

Это полезно, если вы создаете / модифицируете свою базу данных с помощью скрипта; Таким образом, вам не нужно вручную проверять удаление предыдущих версий таблицы. Вы просто делаете это DROP IF EXISTSи забываете об этом.

Конечно, ваш текущий движок БД может не поддерживать эту опцию, трудно сказать больше об ошибке с информацией, которую вы предоставляете.

SJuan76
источник
Также стоит упомянуть, что некоторые РСУБД (в частности, PostgreSQL) выдают предупреждение, если вы пытаетесь, drop some_table if exists;и таблица some_tableне существует.
Ах, и конечно juegen d и Flakron правы. DROPнужно, чтобы вы указали тип объекта ( TABLEв данном случае)
SJuan76