DROP ЕСЛИ СУЩЕСТВУЕТ ПРОТИВ DROP? - PullRequest
151 голосов
/ 05 марта 2012

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

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

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

Ответы [ 5 ]

272 голосов
/ 05 марта 2012

Стандартный синтаксис 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 с большой осторожностью.

35 голосов
/ 15 апреля 2016

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

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

DROP TABLE IF EXISTS dbo.Table

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

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; 
17 голосов
/ 05 марта 2012

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

drop table [table_name]

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

Использование

drop table if exists [table_name]

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

5 голосов
/ 05 марта 2012
DROP TABLE IF EXISTS [table_name]

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

DROP TABLE [table_name]

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

4 голосов
/ 05 марта 2012

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

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

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

...