УДАЛИТЬ, ЕСЛИ СУЩЕСТВУЕТ, ПРОТИВ УДАЛИТЬ?

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

DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]

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


person AbdulAziz    schedule 05.03.2012    source источник
comment
Если вы ищете грамматику SQL Server, она здесь: stackoverflow.com/questions/7887011/   -  person Drew Delano    schedule 03.06.2015
comment
Я думаю, что это должно иметь тег на вопрос, для какой конкретной базы данных.   -  person Tom Stickel    schedule 10.11.2018


Ответы (5)


Стандартный синтаксис 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;

Используйте КАСКАД с большой осторожностью.

person Mike Sherrill 'Cat Recall'    schedule 05.03.2012
comment
Просто решил упомянуть, что было бы действительно хорошо использовать CASCADE в блоке транзакций (BEGIN ... COMMIT). Таким образом становится ясно, как это повлияет на базу данных, до того, как потенциально будет уничтожена куча данных, которые вы, возможно, не хотели. - person jbowman; 21.04.2015
comment
DROP IF EXISTS (без CASCADE) также добавлен в SQL Server 2016. См. blogs.msdn.com/b/sqlserverstorageengine/archive/2015/11/03/ - person Jovan MSFT; 03.11.2015

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

Из 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; 
person Squazz    schedule 15.04.2016

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

drop table [table_name]

который удаляет таблицу.

С использованием

drop table if exists [table_name]

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

person juergen d    schedule 05.03.2012

DROP TABLE IF EXISTS [table_name]

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

DROP TABLE [table_name]

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

person Flakron Bytyqi    schedule 05.03.2012

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

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

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

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