我该如何重新设计此查询?

时间:2012-04-26 07:39:05

标签: java sql jdbc derby

如何重新设计以下查询以避免错误:

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)
    .....

我理解异常的原因。我通过将电子邮件地址放在双引号中直接运行此查询,但我该怎么做?

编辑我们不能在表名中加@

enter image description here

4 个答案:

答案 0 :(得分:3)

大多数数据库允许表名中的任意字符,只要将它们包含在DB的正确引号中即可。例如,

对于MySQL:

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

对于DB2:

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

对于SQL Server:

"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'

答案 1 :(得分:1)

您正在尝试将表名称设为电子邮件地址,但您的表名中不能包含@。替换它。

但正如arnaud所说:你确定要为每个用户创建一个表吗?

Beter制作一个包含用户ID的列的常规电子邮件表。

编辑:

如果您使用反引号,您可以在表名中添加@。例如:

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

但你不应该这样做。

答案 2 :(得分:0)

我认为你应该做的是引用UserEmail变量,如下所示:

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

我认为这会奏效。 mysql中的表名可以同时包含两者。和@ sign。

答案 3 :(得分:0)

这取决于您使用的数据库。在sql server中,你需要在mysql中使用[table_name],你需要'table_name'

这将禁止表名

中的任何特殊字符