SQL Server поддерживает синтаксис DIE ( удалить таблицу, если существует ):
Несколько таблиц могут быть удалены в любой базе данных.Если отбрасываемая таблица ссылается на первичный ключ другой таблицы, которая также отбрасывается, таблица ссылок с внешним ключом должна быть указана перед таблицей, содержащей первичный ключ, на который ссылается.
Пример:
CREATE TABLE t1(i INT PRIMARY KEY);
CREATE TABLE t2(i INT PRIMARY KEY);
CREATE TABLE t3(i INT PRIMARY KEY, t2_id INT REFERENCES t2(i));
Правильный способ отбрасывания объектов: t1 / t3 и, наконец, t2.
Допустим, мы выполняем:
DROP TABLE IF EXISTS t1,t2,t3;
-- Could not drop object 't2' because it is referenced by a FOREIGN KEY constraint.
Всекак и ожидалось, DDL не может завершиться успешно, поскольку имеется удержание FK.
Теперь я ожидал, что для DDL должно выполняться поведение "все или ничего" .Таким образом, у меня все еще должны быть мои 3 стола в целости.Но это не так, таблицы t1 и t3 были удалены.
SELECT * FROM t1;
-- Invalid object name 't1'.
SELECT * FROM t2;
SELECT * FROM t3;
-- Invalid object name 't3'.
db <> fiddle demo
Это выглядит внутреннеон выполняется как 3 независимых оператора отбрасывания, что нечетно.
Есть ли какая-то причина, по которой таблицы t1 и t3 исчезли или я упустил что-то очевидное?