DROP IF EXISTS VS DROP?
Может ли кто-нибудь сказать мне, есть ли разница между
DROP IF EXISTS [TABLE_NAME]
DROP [TABLE_NAME]
Я спрашиваю об этом, потому что я использую шаблон JDBC в своем веб-приложении MVC. Если я использую DROP [TABLE_NAME]
, ошибка говорит о том, что таблица существует. И если я использую DROP IF EXISTS [TABLE_NAME]
, это говорит о плохой грамматике SQL. Может кто-нибудь помочь?
Ответы
Ответ 1
Стандартный синтаксис 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 с большой осторожностью.
Ответ 2
Это не то, что задают напрямую. Но, глядя, как правильно делать таблицы, я наткнулся на этот вопрос, поскольку, как я думаю, многие другие тоже делают.
Из 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;
Ответ 3
Вы забыли table
в своем синтаксисе:
drop table [table_name]
который отбрасывает таблицу.
Использование
drop table if exists [table_name]
проверяет, существует ли таблица перед ее удалением.
Если он существует, он будет удален.
Если нет, ошибка не будет выбрана и никаких действий не будет предпринято.
Ответ 4
DROP TABLE IF EXISTS [table_name]
сначала проверяет, существует ли таблица, если она удаляет таблицу
в то время как
DROP TABLE [table_name]
он удаляется без проверки, поэтому, если он не существует, он выходит с ошибкой
Ответ 5
Если таблица с таким именем не существует, DROP
не работает с ошибкой, а DROP IF EXISTS
просто ничего не делает.
Это полезно, если вы создаете/модифицируете свою базу данных с помощью script; таким образом, вам не нужно вручную проверять, чтобы предыдущие версии таблицы были удалены. Вы просто делаете DROP IF EXISTS
и забываете об этом.
Конечно, ваш текущий механизм БД может не поддерживать эту опцию, сложно сообщить об ошибке с информацией, которую вы предоставляете.