0

同じことを別のテーブルで実行している準備済みステートメントがいくつかあります。

ReportImageWrongLang = con.prepareStatement("INSERT INTO userReportedWrongLang VALUES (?,?,?) ON DUPLICATE KEY UPDATE UserId=UserID");
ReportImageProhibited = con.prepareStatement("INSERT INTO userReportedImages VALUES (?,?,?) ON DUPLICATE KEY UPDATE UserId=UserID");

ReportElse = con.prepareStatement("INSERT INTO Reportelse VALUES (?,?,?) ON DUPLICATE KEY UPDATE UserId=UserID");

Java プログラムのイベントに従って、このステートメントを呼び出しています。

この 3 つのステートメントを 1 つのステートメントに変更します。

Report = con.prepareStatement("INSERT INTO ? VALUES (?,?,?) ON DUPLICATE KEY UPDATE UserId=UserID");

最初のパラメーターをテーブル名に設定します (Report.setString (1,tableName))

しかし、私はこのエラーが発生しています:

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 ''userreportedimages' VALUES ('3',331,1) ON DUPLICATE KEY UPDATE UserId=UserID' at line 1

それを行う方法はありますか?

4

1 に答える 1

0

テーブル名や列名などの SQL 識別子をパラメーター化することはできません。

ただし、テーブルまたは列の名前を引数として取り、それを SQL 文字列に連結する Java 関数を作成することはできます。ただし、SQL インジェクション攻撃を防ぐためにサニタイズするように注意してください。

そうは言っても、このようなことをする必要があるということは、多くの場合、スキーマがひどく非正規化されていることを示しています。同じ構造を持つ複数のテーブルは、多くの場合、2 つの間の相違点を示す列を持つ 1 つのテーブルに結合できます (また結合する必要があります)。

于 2013-04-27T19:35:48.347 に答える