2

エラーを回避するために次のクエリを再設計するにはどうすればよいですか:

String sqlQueryToMakeTable = "create table " + UserEmail + 
                                        "(" +
                                           "NameOfThePhoto varchar(255)," + 
                                            "Caption varchar(255)" +
                                         ")";
// UserEmail is of type String

UserEmailの形式はuser@host.comで、クエリを実行すると次のエラーが発生します。

java.sql.SQLSyntaxErrorException: Lexical error at line 1, column 18.  Encountered: "@" (64), after : "".
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException(Unknown Source)
at org.apache.derby.client.am.Connection.prepareStatement(Unknown Source)
at com.sun.gjc.spi.base.ConnectionHolder.prepareStatement(ConnectionHolder.java:562)
at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:255)
at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCachedStatement(ConnectionWrapper40.java:52)
at com.sun.gjc.spi.ManagedConnection.prepareCachedStatement(ManagedConnection.java:964)
    .....

例外の理由がわかりました。メールアドレスを二重引用符で囲んでこのクエリを直接実行しますが、ここで何をすればよいですか?

EDITテーブル名に @ を含めることはできませんか?

ここに画像の説明を入力

4

4 に答える 4

3

ほとんどのデータベースでは、DB の正しい引用符で囲む限り、テーブル名に任意の文字を使用できます。例えば、

MySQL の場合:

"create table `" + UserEmail + "` " +

DB2 の場合:

"create table \"" + UserEmail + "\" " +

SQL サーバーの場合:

"create table [" + UserEmail + "] " +

Derby の場合、DB2 のように二重引用符が機能するようです: http://db.apache.org/derby/docs/10.0/manuals/reference/sqlj08.html

繰り返しになりますが、なぜユーザーごとにテーブルを作成するのですか??

更新: 通常のアプローチでは、ユーザーの識別に使用できるいくつかのデータも含む単一のキャプション テーブルを用意します。例えば:

CREATE TABLE PhotoCaptions (
    UserEmail      varchar(255),
    NameOfThePhoto varchar(255),
    Caption        varchar(255)
)

次に、特定のユーザーの特定の写真のキャプションを見つけるには、次のようなクエリを使用します。

SELECT Caption FROM PhotoCaptions 
WHERE UserEmail = 'email' AND NameOfThePhoto = 'photoname'
于 2012-04-26T07:47:45.210 に答える
1

テーブル名を電子メール アドレスに置き換えようとしていますが、テーブル名に a を含めることはできません@。交換してください。

しかし、arnaud が述べたように: すべてのユーザーに対してテーブルを作成してもよろしいですか?

ユーザーIDを含む列を持つ一般的な電子メールテーブルを作成することをお勧めします。

編集:

バッククォートを使用する場合は、テーブル名に @ を含めることができます。例:

create table `user@host.com` (id int);

しかし、あなたはそれをすべきではありません。

于 2012-04-26T07:42:26.833 に答える
0

あなたがすべきことは、次のように UserEmail 変数を引用することだと思います:

String sqlQueryToMakeTable = "create table \'" + UserEmail + "\'" + 
                                        "(" +
                                           "NameOfThePhoto varchar(255)," + 
                                            "Caption varchar(255)" +
                                         ")";

これはうまくいくと思います。mysql のテーブル名には両方を含めることができます。と@記号。

于 2012-04-26T07:46:01.717 に答える
0

使用しているデータベースによって異なります。SQLサーバーでは、必要な[table_name]mysqlで使用する必要があります'table_name'

これにより、テーブル名の特殊文字の意味が抑制されます

于 2012-04-26T07:47:22.483 に答える