如何使用Spring JdbcTemplate截断表?

5

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

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

出现错误:

原因:org.springframework.jdbc.BadSqlGrammarException: StatementCallback; SQL语法错误 [TRUNCATE TABLE RESULT_ACCOUNT]; 嵌套异常为 java.sql.SQLException: 在语句中出现了意外的标记: TRUNCATE [TRUNCATE]

有什么想法吗?

5个回答

6
问题在于您无法在现有事务中执行任何DDL操作(例如截断)。原因是DDL会自动提交,这与事务概念不符(即回滚)。因此,我将该方法设置为NOT_SUPPORTED,然后就可以了。

你是怎么把方法设置成 NON_SUPPORTED 的? - Mike Rylander
在你的方法上添加"@Transactional(propagation = NOT_SUPPORTED)"。 - gshock

1
我发现SQLException并不总是直接指向问题。我建议直接在数据库上运行truncate查询,看看是否有效。(很可能从数据库本身获得更好的调试信息。)这可能是外键约束违规、需要级联删除调用等问题。

是的,当直接运行在数据库上时它确实有效。 - Marcus Leon

0

你确定你执行这个命令的数据库支持TRUNCATE TABLE命令吗?因为这个错误信息和异常类型似乎表明它不支持。

你可能需要查看嵌套异常和堆栈跟踪的其余部分来确定这个消息的来源。


0

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


-1

错误的根本原因是您的SQL语句对于您所使用的数据库无效。您可以通过异常为SQLException(即不来自Spring)来判断,因此您的RDBMS基本上是在说“我不知道‘TRUNCAT TABLE FOO’是什么意思。”

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接