Найти тему
SQL от sql-ex.ru

Удалить таблицу, если она существует

В ранних версиях SQL Server (до 2017) при удалении несуществующей таблицы таблицы вы получали сообщение об ошибке:

"Не удалось удалить таблица "t1", так как он не существует или отсутствуют разрешения."

В рамках интерактивного (чистого) SQL избежать возникновения ошибки в этом случае не получалось. Однако проблема легко решается процедурно (T-SQL):

IF object_id('t1') IS NOT NULL
DROP TABLE t1;

Встроенная функция object_id возвращает идентификатор объекта, заданного именем, или же NULL, если такого имени не существует.

И вот в SQL Server 2017 появился оператор DROP TABLE IF EXISTS, который не вызывает ошибки, если удаляемой таблицы не существует, например:

DROP TABLE IF EXISTS t1;

Теперь предположим, что нам нужно удалить связанные таблицы. Рассмотрим следующий пример:

CREATE TABLE t1(id INT IDENTITY PRIMARY KEY);
CREATE TABLE t2(id INT IDENTITY PRIMARY KEY,
t1_id INT REFERENCES t1);
GO
INSERT INTO T1 DEFAULT VALUES;
GO 3 -- выполним предыдущий пакет (т.е. вставку) 3 раза

Проверим

SELECT * FROM t1;

id

1

2

3

INSERT INTO t2(t1_id) VALUES(1),(2);
SELECT * FROM t2;

id t1_id

1 1

2 2

Стандартное каскадное удаление

DROP TABLE t1 CASCADE;

работать не будет, т.к. оно еще не реализовано в SQL Server (но работает, например, в PostgreSQL), тогда как оператор

DROP TABLE t1;

вызовет следующую ошибку:

"Невозможно удалить объект "t1", так как на него ссылается ограничение FOREIGN KEY."

Мы можем удалить связанные таблицы одним оператором, перечислив их через запятую (сначала подчиненную таблицу, а затем - главную):

DROP TABLE t2,t1;

Если указать таблицы в неправильном порядке, т.е. t1,t2, то при удалении t1 будет получена вышеприведенная ошибка, а потом будет удалена t2.

Если среди перечисленных таблиц (не обязательно две) могут быть отсутствующие, то тогда поможет новый оператор:

DROP TABLE IF EXISTS t2,t1;

Заметим, что оператор DROP ... IF EXISTS может применяться и к другим объектам базы данных, например, представлениям и хранимым процедурам.

Возможно, что в следующих версиях SQL Server может появиться и оператор типа:

CREATE TABLE IF NOT EXISTS...

который будет создавать таблицу только в том случае, если такой не существует.

Блоги по T-SQL на sql-ex.ru