我有一个准备好的声明:
CREATE TABLE IF NOT EXISTS ? (uuid VARCHAR(128), item VARCHAR(48), value FLOAT, UNIQUE (uuid))
如果我直接在PMA中执行此操作,但更换了?使用任何文本文本,它完美地工作,它正确地创建表。但是,如果我从Java运行它就不起作用。
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;查看与MySQL服务器版本对应的手册,以便在''Murder_PlayerData'附近使用正确的语法(uuid VARCHAR(128),item VARCHAR(48),value FLOAT,UNIQUE(u'在第1行
这是Java代码
String table = "Murder_PlayerData";
String execute = "CREATE TABLE IF NOT EXISTS ? (uuid VARCHAR(128), item VARCHAR(48), value FLOAT(11), UNIQUE (uuid))";
PreparedStatement statement = sql.getConnection().prepareStatement(execute);
statement.setString(1, table);
statement.execute();
为什么它在PMA中起作用,但在我从Java中起作用时却不起作用?
答案 0 :(得分:1)
准备语句不能用于来定义表名,而是定义与列相关的值(插入值,where
或having
条件的值,等等) 。理解它的一种方法是:准备语句用于DML操作,而不用于DDL操作。
如果要在运行时构建表,则需要“手动”构建SQL语句:
String table = "Murder_PlayerData"
String strSQL = "create table if not exists " + table + "("
// Add your column definitions
+ ")"
Statement stmt = conn.createStatement();
stmt.execute(strSQL);
请注意,如果变量table
可以填充用户提供的数据,那么您的代码将容易受到SQL Injection Attacks的攻击。我建议你不要创建表,如果他们的名字必须由用户提供,而是在没有任何用户交互的情况下创建表,然后插入值,使用某种键来识别属于哪些记录每个用户。