ДРОП, ЯКЩО ВІДПОВІДАЄТЬСЯ ПРО ДРОП?


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 з великою обережністю.


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; 

17

Ви забули tableу своєму синтаксисі:

drop table [table_name]

який скидає стіл.

Використання

drop table if exists [table_name]

перевіряє, чи існує таблиця, перш ніж її відкинути.
Якщо він існує, він падає.
Якщо ні, жодна помилка не буде викинута і не буде вжито жодних дій.


4
DROP TABLE IF EXISTS [table_name]

він спочатку перевіряє, чи існує таблиця, чи вона видаляє таблицю

DROP TABLE [table_name]

він видаляється без перевірки, тому якщо його немає, він виходить із помилкою


3

Якщо немає таблиці з таким ім'ям, DROPпомилка при цьомуDROP IF EXISTS просто нічого не робить.

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

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


Можливо, варто також зазначити, що деякі RDBMS (зокрема PostgreSQL) видають попередження, якщо ви спробуєте, drop some_table if exists;а таблиця some_tableне існує.

Ах, і звичайно юеген д і Флакрон мають рацію. DROPВам потрібно вказати тип об’єкта ( TABLEу даному випадку)
SJuan76
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.