2012-02-12 32 views
8

Câu lệnh được chuẩn bị này có vẻ giống như SQL hợp lệ đối với tôi.Bảng tóm tắt Mysql dưới dạng PreparedStatement không hoạt động đối với tôi

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

Nhưng khi tôi chạy này, tôi nhận được lỗi:

Exception in thread "main" 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 ''features'' at line 1 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at 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) at com.mysql.jdbc.Util.getInstance(Util.java:381) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1031) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) at 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) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2648) 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)

Có ai nhìn thấy vấn đề ở đây? Tôi bối rối.

+4

Tôi không tham gia Java, nhưng tất cả các thư viện báo cáo đã chuẩn bị mà tôi biết không hỗ trợ tên bảng động. –

Trả lời

7

MySQL không hỗ trợ chuẩn bị phát biểu với các tên bảng biến, vì vậy bạn phải làm điều này theo cách cũ thời, bằng cách tạo ra SQL:

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

Trong trường hợp này, bạn cũng có thể sử dụng các câu lệnh thông thường vì bạn không đạt được bất kỳ điều gì bằng cách sử dụng câu lệnh đã chuẩn bị.

1

Tôi nghĩ rằng mã của bạn chuẩn bị tuyên bố này:

DROP TABLE IF EXISTS 'features' 

khi bạn muốn:

DROP TABLE IF EXISTS features 
1

PreparedStatements được sử dụng để làm cơ sở dữ liệu biên dịch truy vấn (làm cho các kế hoạch thực hiện) một lần, vì vậy thực hiện các cùng một truy vấn với các tham số khác nhau xảy ra nhanh hơn.

Viết tắt trong PreparedStatement bạn không thể có ký tự đại diện cho các đối tượng cơ sở dữ liệu. Bao gồm tên bảng, tên cột, điều khoản và khác nhau ở đâu ....

0

Bạn không thể sử dụng câu lệnh đã chuẩn bị để thả bảng có tên bảng động. Tuy nhiên, nếu bạn không biết tên bảng cho đến khi thời gian chạy và chúng có thể có khoảng trống trong chúng, thì bạn sẽ cần phải đính kèm chúng trong các dấu tích sau:

for (String tableName : tableNames) { 
    statement.executeUpdate("DROP TABLE IF EXISTS `" + tableName + "`"); 
} 
Các vấn đề liên quan