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: 準備済みステートメント パラメーターをテーブル名として使用できない。

");問題 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 に答える