【问题标题】:How to truncate a table with Spring JdbcTemplate?如何使用 Spring JdbcTemplate 截断表?
【发布时间】:2010-05-24 20:16:30
【问题描述】:

我正在尝试使用 Spring 截断表格:

jdbcTemplate.execute("TRUNCATE TABLE " + table);

得到错误:

引起:org.springframework.jdbc.BadSqlGrammarException: 语句回调;糟糕的 SQL 语法 [截断表结果帐户]; 嵌套异常是 java.sql.SQLException:意外 令牌:语句中的 TRUNCATE [截断]

有什么想法吗?

【问题讨论】:

    标签: oracle spring truncate jdbctemplate


    【解决方案1】:

    这里的问题是您不能在现有事务中执行任何 DDL(例如截断)。原因是 DDL 执行自动提交,它与事务概念(即:回滚)无关。所以我将方法设置为NOT_SUPPORTED,我很好。

    【讨论】:

    • 你是如何将方法设置为NON_SUPPORTED的?
    • 在您的方法中添加“@Transactional(propagation = NOT_SUPPORTED)”
    【解决方案2】:

    我发现 SQLExceptions 并不总是直接指向问题。我会尝试直接在数据库上运行截断查询,看看它是否有效。 (您很可能会从数据库本身获得更好的调试信息。)这可能是违反外键约束、需要级联丢弃调用等。

    【讨论】:

    • 是的,直接对数据库运行时它确实有效。 ??
    【解决方案3】:

    您确定要执行此命令的数据库支持TRUNCATE TABLE 命令吗?因为this error message and exception type 听起来确实不像。

    您可能想查看嵌套异常和堆栈跟踪的其余部分,以确定此消息来自何处。

    【讨论】:

      【解决方案4】:

      这里数据库允许截断.. JDBC 模板或 Jdbc 驱动程序不允许截断操作

      【讨论】:

        【解决方案5】:

        错误的根本原因是您的 SQL 语句对于您正在与之交谈的数据库无效。您可以判断,因为异常是 SQLException(即不是来自 Spring),所以您的 RDBMS 本质上是在说“我不知道“TRUNCAT TABLE FOO”是什么意思。

        您需要阅读您的数据库系统手册以了解如何截断您的表。尽管许多主要数据库(无论如何都是最新版本)似乎支持TRUNCATE TABLE 语句,但听起来您的可能不支持。

        虽然效率较低,但您也可以尝试查询DELETE FROM FOO,其中FOO 是您的表名。

        【讨论】:

          猜你喜欢
          • 2011-08-23
          • 2014-06-11
          • 1970-01-01
          • 2012-10-24
          • 2012-01-21
          • 2010-10-26
          • 2011-02-28
          • 2012-03-30
          • 2014-11-30
          相关资源
          最近更新 更多