2 votes

Plusieurs requêtes de suppression dans une seule requête JDBC

J'ai un problème dans ma classe avec la génération de la commande de suppression :

    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();
}

La requête que j'obtiens est valide lorsque je l'utilise dans phpmyadmin - mais lorsque j'essaie de l'utiliser avec jdbc executeUpdate() je reçois MySQLSyntaxError, c'est-à-dire que pour la table "trasy" avec deux clés étrangères exportées, la requête ressemble à ceci :

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

Cela n'a pas d'importance s'il y a \n entre les requêtes ou non.

5voto

Utilisez le .addBatch() méthode sur Statement et ajouter chaque DELETE interrogation séparée et .executeBatch() en tant que lot.

Si vous utilisez des transactions, vous pouvez tester les comptes renvoyés par chaque déclaration et, si quelque chose ne va pas, vous pouvez .rollback() le lot entier.

J'ai un projet open source qui montre exactement comment faire cela.

Kit de construction SQL sur GitHub il existe un AbstractDatabase.java qui a un .executeBatch() que vous pouvez copier et utiliser vous-même avec très peu de modifications. Elle contient même le code permettant de tester chaque commande et d'effectuer le commit/rollback.

1voto

snajahi Points 851

Jdbc exécute un à la fois, de sorte que vos déclarations, même si elles sont séparées par de multiples \n sont en fait exécutées comme une seule instruction, d'où l'erreur de mysql.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X