【问题标题】:truncate not always working: why?截断并不总是有效:为什么?
【发布时间】:2015-08-12 11:41:01
【问题描述】:

我已经定义了这个映射器方法:

@Delete("truncate table MY_TABLE")
public void wipeAllData();

它通常可以工作...无论如何有时它不会...有什么特别的原因/已知的错误吗?

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

【问题讨论】:

  • 你的mysql版本是多少?
  • 嗨,我的 dbms 是 oracle11g 也许你的意思是 mybatis 版本?现在是 3.3.0
  • 我假设是 mysql。我将使用适当的文档更新我的答案

标签: oracle11g mybatis ibatis


【解决方案1】:

编辑

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

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

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

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

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

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

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

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

另外,对于有约束的表,截断操作不会删除表,它会一一删除注册表。如果您的约束中有ON DELETE CASCADE,否则将引发错误。对于 oracle 数据库仍然如此

另一件事应该注意的是

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

因此,如果您以任何方式在该表上设置了触发器,它将什么也不做。

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

【讨论】:

  • 您好,这似乎不是我的情况:此 Web 方法仅由一个客户端调用,并且该表上没有定义任何约束或触发器。另外,我没有收到任何错误消息或异常,这让一切变得更加奇怪..
  • 那我建议添加一些日志框架并配置ibatis实例调试几天看看发生了什么。也许一些内部异常被抛出并在某处被捕获。
  • 我会尝试谢谢,非常有用的答案还是谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-24
  • 2019-08-02
  • 2016-11-11
  • 2023-01-31
  • 2020-08-10
  • 2021-08-17
相关资源
最近更新 更多