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

时间:2015-08-12 11:41:01

标签: oracle11g mybatis ibatis

我已经定义了这个mapper方法:

export class MyClass {
    public Test(): string {
        return "Erik";
    };

    constructor() {
    };
};

并且它通常有效...无论如何有时候它没有......是否有任何特殊原因/已知的错误?

我正在使用mybatis 3.3.0和oracle 11g作为DBMS。

1 个答案:

答案 0 :(得分:2)

修改

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

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

  

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

     

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

     

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

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

  

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

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

此外,对于具有约束的表,truncate操作不会删除表,它将逐个删除注册表。如果您对约束有ON DELETE CASCADE,如果没有,则会抛出错误。对于oracle数据库

,这仍然是正确的

另一件事需要注意的是

  

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

因此,如果您在该表上有任何触发器,它将无效。

关于TRUNCATE命令的原始DOC在这里: TRUNCATE TABLE