SQL Server支持DIE语法(drop table if exists):
可以在任何数据库中删除多个表。如果要删除的表引用了另一个也要删除的表的主键,则必须在具有外键的引用表之前列出包含要引用的主键的表。
示例:
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.
一切正常,由于存在FK,DDL无法成功完成。
现在,我希望DDL能够保持全有或全无的行为。所以我仍然应该完整保留我的3张桌子。但事实并非如此,表t1和t3被删除。
SELECT * FROM t1;
-- Invalid object name 't1'.
SELECT * FROM t2;
SELECT * FROM t3;
-- Invalid object name 't3'.
看起来内部它是作为3个独立的drop语句执行的,这很奇怪。
表t1和t3消失了还是有什么原因吗?