2

クラスでdeleteコマンドの生成に問題があります。

    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が発生します。つまり、2つのエクスポートされた外部キークエリを持つテーブル「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()上のメソッドを使用して、StatementDELETEクエリを個別に追加し、.executeBatch()それらをバッチとして追加します。

トランザクションを使用する場合は、各ステートメントによって返されるカウントをテストできます。何か問題がある場合は.rollback()、バッチ全体をテストできます。

これを行う方法を正確に示すオープンソースプロジェクトがあります。

GitHubのSQLConstructionKitには、ほとんど変更を加えることなく自分でコピーして使用できるメソッドを持つAbstractDatabase.javaクラスがあります。.executeBatch()各コマンドをテストし、コミット/ロールバックを実行するためのコードも含まれています。

于 2012-09-06T19:51:45.070 に答える
1

jdbcは一度に1つのステートメントを実行するため、ステートメントが\ nで複数区切られている場合でも、実際には1つの命令として実行されるため、mysqlからのエラーが発生します。

于 2012-09-06T19:55:37.237 に答える