1

我正在尝试创建一个类似于我之前创建的现成表(一个模板,如果你愿意的话)的表,其中唯一的变量应该是表名。

这是我到目前为止所尝试的:我将模板表导出到 mysql 代码并将代码复制到preparedStatement 对象,如下所示:

createNewLineTableStatement = constantLink.prepareStatement("CREATE TABLE IF NOT EXISTS ? (" +
                    "  `index` int(5) NOT NULL," +
                    "  `station` int(5) NOT NULL," +
                    "  PRIMARY KEY (`index`)," +
                    "  UNIQUE KEY `station` (`station`)" +
                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;\");"); 

比我尝试通过调用以下函数来执行代码:

private static boolean createNewLineTable(String tableName) throws SQLException{
    createNewLineTableStatement.setString(1, tableName);
    if (createNewLineTableStatement.executeUpdate() == Statement.EXECUTE_FAILED)
        return false;
    return true;
}

但我收到语法错误异常:

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 ''line_37_var_1' (  `index` int(5) NOT NULL,  `station` int(5) NOT NULL,  PRIMARY' at line 1

如何修复代码?或者是否有更清洁、更好的方法来做同样的事情?也许创建一个带有用户变量的脚本?我想到了这一点,但我以前从未使用过 .sql 脚本。

4

3 回答 3

2

问题1:不能使用prepared statement参数作为表名。

");问题 2:您的语句末尾有一个不匹配的括号和多余的字符。

您的查询字符串应类似于:

String query = "CREATE TABLE IF NOT EXISTS `" + tableName + "` (" +
    "  `index` int(5) NOT NULL," +
    "  `station` int(5) NOT NULL," +
    "  PRIMARY KEY (`index`)," +
    "  UNIQUE KEY `station` (`station`)" +
    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
于 2013-01-18T13:05:51.410 回答
0

按照设计,TableName 和 ColumnNames 不能参数化。

如果您对此感到害怕SQL Injection,请创建一个自定义函数来检查恶意 tableName。如果值出现在您的应用程序内部,则它是安全的。

然后将其连接到字符串中,为第一级防御添加反引号:D

String tableName = "Your tableName";
String query = "CREATE TABLE IF NOT EXISTS `" + tableName + "` (" +
                    "  `index` int(5) NOT NULL," +
                    "  `station` int(5) NOT NULL," +
                    "  PRIMARY KEY (`index`)," +
                    "  UNIQUE KEY `station` (`station`)" +
                    ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
于 2013-01-18T13:04:43.070 回答
0

您缺少表名,我认为“?” 不应该在那里。

我会像

"CREATE TABLE IF NOT EXISTS YOURTABLE" + the following code
于 2013-01-18T13:07:34.623 回答