一次删除多个表

时间:2019-06-16 21:20:14

标签: sql sql-server tsql drop-table

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'.

db<>fiddle demo

看起来内部它是作为3个独立的drop语句执行的,这很奇怪。

表t1和t3消失了还是有什么原因吗?

1 个答案:

答案 0 :(得分:0)

问题是,DBMS将删除它可以删除的任何表,但是此操作不是原子的。如果您需要原子表达式,则可以在交易中使用条件ROLLBACK(有关更多信息,请参见here