这个准备好的语句对我来说似乎是有效的SQL .
PreparedStatement dropTable = cnx.prepareStatement(
"DROP TABLE IF EXISTS ?");
dropTable.setString(1, "features");
dropTable.execute();
但是当我运行它时,我得到错误:
线程“main”中的异常com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;检查对应于你的MySQL服务器版本使用附近的'特色'在管线1 sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java正确的语法手册: 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)在com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3490)在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)在com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077)在com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1356)在doriangray.db.TestSetup.main(TestSetup.java:62 )
有人在这看到问题吗?我很难过 .
4 回答
您不能使用预准备语句删除具有动态表名的表 . 但是,如果您在运行时之前不知道表名,并且它们中可能有空格,那么您需要将它们包含在后面的标记中:
MySQL不支持带有变量表名的预处理语句,因此您必须通过生成SQL以旧方式执行此操作:
在这种情况下,你也可以使用常规语句,因为你没有通过使用预准备语句获得任何东西 .
我认为你的代码准备了这个声明:
你想要的时候:
PreparedStatements用于使数据库编译查询(制定执行计划)一次,因此执行具有不同参数的相同查询的速度更快 .
简而言之,在PreparedStatement中,您不能拥有数据库对象的通配符 . 包括表名,列名,不同where子句和....