2

我在课堂上生成删除命令时遇到问题:

    private String generateDeleteCommand() {
    StringBuilder deleteCommand = new StringBuilder();
    for (ForeignKey fk : exportedForeignKeys) {
        deleteCommand.append("DELETE FROM ").append(fk.foreignTableName)
                .append(" WHERE ").append(fk.foreignColumnName)
                .append("=:").append(fk.primaryColumnName).append(";\n");
    }
    deleteCommand.append("DELETE FROM ").append(tableName)
            .append(" WHERE ");
    for (String key : primaryKeys.keySet()) {
        deleteCommand.append(key).append("=:").append(key).append(" AND ");
    }
    deleteCommand
            .delete(deleteCommand.length() - 5, deleteCommand.length());
    deleteCommand.append(";");
    System.out.println(deleteCommand);
    return deleteCommand.toString();
}

在 phpmyadmin 中使用时,我得到的查询是有效的 - 但是当我尝试将它与 jdbc executeUpdate() 一起使用时,我得到 MySQLSyntaxError,即对于带有两个导出外键的表“trasy”查询看起来像:

DELETE FROM kursy WHERE ID_TRASY=19;
DELETE FROM przystanki WHERE ID_TRASY=19;
DELETE FROM trasy WHERE ID_TRASY=19;

例外:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your    SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELETE FROM przystanki WHERE ID_TRASY=19;
DELETE FROM trasy WHERE ID_TRASY=19' at line 2

查询之间是否有 \n 无关紧要。

4

2 回答 2

5

使用.addBatch()on 方法Statement并分别添加每个DELETE查询并将.executeBatch()它们作为批处理。

如果使用事务,您可以测试每个语句返回的计数,如果有任何问题,您可以测试.rollback()整个批次。

我有一个开源项目,它准确地展示了如何做到这一点。

GitHub 上的 SQL 构建工具包,有一个AbstractDatabase.java类,它有一个.executeBatch()方法,您可以复制和使用自己,只需很少修改。它甚至有用于测试每个命令和执行提交/回滚的代码。

于 2012-09-06T19:51:45.070 回答
1

jdbc 一次执行一个语句,所以你的语句,即使是由 \n 分隔的多个语句,实际上也是作为一条指令执行的,因此来自 m​​ysql。

于 2012-09-06T19:55:37.237 回答