Oracle11g 截断不总是有效:为什么?

Oracle11g 截断不总是有效:为什么?,oracle11g,mybatis,ibatis,Oracle11g,Mybatis,Ibatis,我已定义此映射器方法: @Delete("truncate table MY_TABLE") public void wipeAllData(); 而且它通常是有效的…不管怎样,有时它不会…有什么特别的原因/已知的错误吗 我正在使用mybatis 3.3.0和oracle 11g作为数据库管理系统。EDIT 因为您添加了oracle11g标记。我之前的答案不再有效,至少不是它不起作用的原因。所以我编辑了它 有一些原因我知道为什么有时候它在ORACLE中不起作用。根据甲骨文文档 不能单独截断属于

我已定义此映射器方法:

@Delete("truncate table MY_TABLE")
public void wipeAllData();
而且它通常是有效的…不管怎样,有时它不会…有什么特别的原因/已知的错误吗

我正在使用mybatis 3.3.0和oracle 11g作为数据库管理系统。

EDIT

因为您添加了oracle11g标记。我之前的答案不再有效,至少不是它不起作用的原因。所以我编辑了它

有一些原因我知道为什么有时候它在ORACLE中不起作用。根据甲骨文文档

不能单独截断属于群集的表。必须截断集群、删除表中的所有行,或者删除并重新创建表

不能截断已启用外键约束的父表。必须在截断表之前禁用约束。例外情况是,如果完整性约束是自引用的,则可以截断表

不能截断引用分区表的父表。必须首先删除引用分区子表

但是您应该知道,在应用程序范围内,使用或使用
TRUNCATE
命令并不理想。它应该是仅在数据库上执行的操作。原因在于文件的另一个指示:

如果表不为空,则数据库会将表上的所有非分区索引和全局分区索引的所有分区标记为不可用。但是,当表被截断时,索引也被截断,并为索引段计算一个新的高水位线。此操作相当于为索引创建新段。因此,在truncate操作结束时,索引再次可用

因此,根据索引和表的大小,这可能是一个非常长的操作

此外,对于具有约束的表,truncate操作不会删除该表,它将逐个删除注册表。如果约束上有关于删除级联的
,如果没有,将抛出错误。对于oracle数据库来说仍然如此

威尔应该注意的另一件事是

使用TRUNCATE TABLE语句删除行可能比使用DELETE语句删除所有行要快,尤其是在表具有多个触发器、索引和其他依赖项的情况下

所以,不管怎样,如果你在那张桌子上有一个触发器,它什么也不会做

关于
TRUNCATE
命令的原始文档如下:

你的mysql版本是什么?嗨,我的dbms是oracle11g,也许你指的是mybatis版本?它是3.3.0,我假设是mysql。我将用适当的docsHello更新我的答案,这似乎不是我的情况:这个webmethod只由一个客户机调用,并且在该表上没有定义约束或触发器。另外,我没有收到任何错误消息或异常,这让一切变得更加奇怪。然后,我建议添加一些日志框架,并将ibatis实例配置为调试几天,以查看发生了什么。也许某个内部异常被抛出并在某个地方被捕获。我会尝试谢谢,非常有用的回答,不管怎样谢谢:)