Mysql Drop Table作为PreparedStatement不适合我

Kev*_*vin 9 java mysql jdbc prepared-statement

这个准备好的语句对我来说似乎是有效的SQL.

PreparedStatement dropTable = cnx.prepareStatement(
    "DROP TABLE IF EXISTS ?");
dropTable.setString(1, "features");
dropTable.execute();
Run Code Online (Sandbox Code Playgroud)

但是当我运行它时,我得到错误:

线程"main"中的异常com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:SQL语法中有错误; 检查与MySQL服务器版本相对应的手册,以便在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(本地方法)第1行的''features''附近使用正确的语法. 57)在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.lang.reflect.Constructor.newInstance(Constructor.java:532)at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)在com.mysql.jdbc.Util.getInstance(Util.java:381)的com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1031)com.mysql.jdbc.SQLError.createSQLException(SQLError.java: 956)com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java) :1959)com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:26)48)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)at doriangray.db.TestSetup.main(TestSetup.java:62 )

有人在这看到问题吗?我很难过.

Jon*_*oni 8

MySQL不支持带有变量表名的预处理语句,因此您必须通过生成SQL以旧方式执行此操作:

PreparedStatement dropTable = cnx.prepareStatement(
String.format("DROP TABLE IF EXISTS %s", "features"));
dropTable.execute();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,你也可以使用常规语句,因为你没有通过使用预准备语句获得任何东西.