删除表后异常
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,则语句将失败并且表变量将被删除,留下一个新表但没有数据。
我的做法是创建一个名称稍有不同的新表,加载数据,在一个语句中更改两个表名,然后在确认加载所有数据后,删除原始表。
【讨论】:
以上是关于删除表后异常的主要内容,如果未能解决你的问题,请参考以下文章
删除表后初始化序列,SQLAlchemy,Postgresql
ORACLE DROP TABLE和truncate table的区别,以及删除表后,相关的索引是不是也一并删除