Mysql Drop Table als PreparedStatement nicht für mich arbeiten
Dieses prepared statement scheint gültige SQL zu mir.
PreparedStatement dropTable = cnx.prepareStatement(
"DROP TABLE IF EXISTS ?");
dropTable.setString(1, "features");
dropTable.execute();
Aber wenn ich diesen starte, bekomme ich die Fehlermeldung:
Exception in thread "main"
com.mysql.jdbc.Ausnahmen.jdbc4.MySQLSyntaxErrorException: Sie haben eine
Fehler in Ihrer SQL-syntax; Lesen Sie im Handbuch, das entspricht Ihrem
MySQL-server-version für den richtigen syntax zur Verwendung in der Nähe von "features" an
Zeile 1 an
Sonne.reflektieren.NativeConstructorAccessorImpl.newInstance0(Native-Methode)
bei
Sonne.reflektieren.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
bei
Sonne.reflektieren.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
bei java.lang.reflektieren.Konstruktor.newInstance(Constructor.java:532)
bei com.mysql.jdbc.Util.handleNewInstance(Util.java:406) at
com.mysql.jdbc.Util.getInstance(Util.java:381) bei
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1031) an
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) an
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558) bei
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490) bei
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) an
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109) an
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648) an
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)
bei
com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)
bei doriangray.db.TestSetup.main(TestSetup.java:62)
Erkennt jemand hier das problem? Da bin ich überfragt.
- Ich bin nicht in Java, sondern alle vorbereiteten Anweisungen Bibliotheken weiß ich nicht unterstützen dynamische Tabellennamen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
MySQL nicht unterstützt prepared statements mit Variablen Tabellennamen, so haben Sie dies zu tun auf die altmodische Weise, durch die Generierung von SQL:
In diesem Fall Sie könnte genauso gut verwenden Sie regelmäßig Aussagen, da Sie nicht alles gewinnen, indem Sie mit prepared statements.
Ich denke, dein code bereitet diese Aussage:
während Sie wollen:
PreparedStatements werden verwendet für die Datenbank kompilieren der Abfrage zu machen (der execution plan) einmal, sodass die Ausführung der Abfrage mit verschiedenen Parametern geschieht schneller.
Kurz in ein PreparedStatement kann man nicht haben eine wildcard für Datenbank-Objekte. Einschließlich Tabellenname, Spaltenname, die verschiedenen where-Klauseln und ....
Können Sie nicht verwenden Sie eine vorbereitete Anweisung zum löschen von Tabellen mit einem dynamischen Tabellennamen. Allerdings, wenn Sie nicht wissen, die Namen der Tabellen, vor der Ausführung, und Sie konnte Leerzeichen, dann müssen Sie schließen Sie in wieder-Zecken: