删除表后异常

Posted

技术标签:

【中文标题】删除表后异常【英文标题】:Exception after dropping table 【发布时间】:2017-10-04 16:51:50 【问题描述】:

如果我执行删除表的过程,然后使用“SELECT INTO”重新创建它。

如果该过程在删除表后引发异常,是否会发生表删除?

【问题讨论】:

是的,我相信唯一一次不需要提交语句的 oracle sql 是需要提交语句的,但我必须查一下才能确定。不过测试起来很容易,只需先选择一个临时表,然后使用错误的 select into 运行您的过程并在数据库中查询临时表。如果它不存在,那么你知道。 【参考方案1】:

除非您将它们包装在事务中,否则表将被删除,因为每个语句都将被视为隐式事务..

以下是一些测试

create table t1
(
id int not null primary key
)

drop table t11
insert into t1
select 1 union all select 1

表 t11 将被删除,即使插入会引发异常..

再举一个例子..

drop table orderstest
print 'dropped table'
waitfor delay '00:00:05'
select * into orderstest
from Orders

现在 2 秒后,终止会话,您仍然可以看到 orderstest 被丢弃

我检查了select into 以外的其他一些语句,我看不出select into 行为不同的原因,即使您将语句包装在存储过程中也是如此。

如果您想全部回滚,请使用事务或更好地使用set xact_Abort on

【讨论】:

【参考方案2】:

是的,丢弃的表将消失。当我编写一个新的主键时,我遇到了这个问题。根据表,它将所有数据保存到内存中的表变量中,删除表,使用新 pk 创建一个新表,然后加载数据。如果数据违反了新的 pk,则语句将失败并且表变量将被删除,留下一个新表但没有数据。

我的做法是创建一个名称稍有不同的新表,加载数据,在一个语句中更改两个表名,然后在确认加载所有数据后,删除原始表。

【讨论】:

以上是关于删除表后异常的主要内容,如果未能解决你的问题,请参考以下文章

django:删除表后怎么重新数据迁移生成表

删除表后初始化序列,SQLAlchemy,Postgresql

连接多个表后如何从sql查询结果中删除重复记录

ORACLE DROP TABLE和truncate table的区别,以及删除表后,相关的索引是不是也一并删除

从数据库中删除所有表后,如何将 prisma 重新部署到数据库

尾插法建表后递归算法删除表中元素