如何重新设计以下查询以避免错误:
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)
.....
我理解异常的原因。我通过将电子邮件地址放在双引号中直接运行此查询,但我该怎么做?
编辑我们不能在表名中加@
答案 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'
这将禁止表名
中的任何特殊字符