【问题标题】:how can i redesign this query?我怎样才能重新设计这个查询?
【发布时间】:2012-05-06 22:22:36
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你到底为什么要每个用户一张桌子?!?!?
  • 您的表名中真的需要字符“@”吗?为什么不直接从 UserEmail 中删除此字符?

标签: java sql jdbc derby


【解决方案1】:

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

对于 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'

【讨论】:

  • 原因:当一个注册用户提交一张带有标题的照片时,带有标题的照片名称会被获取到他的表格中,以便在需要显示它们时连接到数据库并找到特定照片的标题
  • @SuhailGupta 查看更新以了解使用关系数据库的常用方法。
  • 请您列出每个用户拥有一张桌子的一些缺点吗?
  • 有几种:表名不能作为数据,比如上传了同名照片的用户是没有办法列出的。此外,数据库(或数据库管理工具)可能不会针对大量表进行优化,因此表的数量可能会受到限制,或者查找数据的速度可能会变得无法接受。
【解决方案2】:

您正在尝试使表名类似于电子邮件地址,但您的表名中不能包含 @。替换它。

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

最好制作一个包含用户 ID 列的通用电子邮件表。

编辑:

如果您使用反引号,则可以在表名中包含 @。示例:

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

但你不应该那样做。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      我认为你应该做的是像这样引用 UserEmail 变量:

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

      我认为这会奏效。 mysql 中的表名可以同时具有 .和@符号。

      【讨论】:

        猜你喜欢
        • 2016-12-13
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 2021-07-31
        • 2013-08-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多