java - 单个 JDBC 查询中的许多删除查询

标签 java mysql jdbc

我在类里面遇到生成删除命令的问题:

    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;

异常(exception):

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并不重要。

最佳答案

使用 .addBatch() Statement 上的方法并分别添加每个 DELETE 查询和 .executeBatch()他们作为一批。

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

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

SQL Construction Kit on GitHub , 有一个 AbstractDatabase.java具有 .executeBatch() 方法的类,您只需稍作修改即可自行复制和使用。它甚至具有用于测试每个命令和执行提交/回滚的代码。

关于java - 单个 JDBC 查询中的许多删除查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12307348/

相关文章:

java - 我发现我的输出有一个小问题!谁能说出我的代码发生了什么?

java - Node.js 解密不适用于其他密码的密文

python - MySQL - 匹配两个包含巨大数据的表并找到相似的数据

mysql - select中where子句或子查询计算中的计数

java - DatabaseMetaData#g​​etTables 在 Derby 中找不到现有表

node.js - 尝试通过 AWS Lambda 连接到 Redshift

java - Android:使用 Gson 解析 JSON 文件时出错

java - hashmap<String, String> 的属性

mysql - 如何以容错方式连接时间戳列

java - 使用jdbc在hive中插入map等复杂类型