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

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

编辑我们不能在表名中有@吗?

在此处输入图像描述

4

4 回答 4

3

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

对于 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'
于 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 server中你需要[table_name]在mysql中使用你需要'table_name'

这将抑制表名中的任何特殊字符含义

于 2012-04-26T07:47:22.483 回答