无法在PostgreSQL中创建名为“用户”的数据库表


93

PostgreSQL似乎不允许创建名为“ user”的数据库表。但是MySQL将允许创建这样的表。

那是因为这是一个关键词吗?但是Hibernate无法识别任何问题(即使我们设置了PostgreSQLDialect)。


2
是的,用户是保留关键字。只是不要将其用作表名。postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet 2014年

您可以在postgreSQL上创建一个名为“ user”的表。但我建议您避免使用表/列/变量...使用令牌关键字的名称
Houari 2014年

非常抱歉,这不是重复的问题。问题是关于PostgreSQL,而不是MySql。谢谢。
香纳2014年

Answers:


142

user 是保留字,通常不建议使用保留字作为标识符(表,列)。

如果您坚持要这样做,则必须将表名放在双引号中:

create table "user" (...);

但是,在引用表时,您总是需要使用双引号。此外,表名区分大小写。"user"表名称不同于"User"

如果您想节省很多麻烦,请使用其他名称。usersuser_account,...

可以在手册中找到有关带引号的标识符的更多详细信息:http : //www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


不幸的是,这不是基于Hibernate的项目的答案,因为topicstarter提到=)这里的实际问题是Hibernate无法自动进行这种转义。尽管被告知正确的方言!因此,正确的答案应该是描述如何在Hibernate中进行工作,而不是在PSQL中进行工作:(
Maksim Gumerov,

3
@MaksimGumerov:正确的答案是:不要使用需要带引号的标识符的名称-无论您使用的是混淆层。
a_horse_with_no_name

不,那不是一个:)您最终将把代码绑定到特定的数据库及其关键字(并且此设置可能会发生变化)。一种实际的解决方案是在全局范围内转义(尽管我自己也没有尝试过),另一种解决方案则依赖于Hibernate方言分析器(但正如我们所看到的,它们并不总是在确定我们是否需要转义某些内容时工作)。
Maksim Gumerov

@MaksimGumerov的要点是您无法创建名为user的表,因为该表已被数据库保留。
IamDOM

当然可以-用引号引起来。也许我不应该,但是那是有争议的。更重要的是如何创建这样的表,此处提出的解决方案(带引号的解决方案)对Hibernate项目无济于事。最初的问题提到了Hibernate,因此答案实际上对IMO的回答还不够好。
Maksim Gumerov

18

可以使用以下语法通过JPA指定表名:

@Table(name="\"user\"")

那解决了我的问题。没有这些,我会收到类似column user0_.id does not exist
James Freitas的

7

前一次我们也遇到过同样的问题,只是将表名从更改userapp_user。由于使用了Hibernate / JPA。我们认为这样会更容易。希望此小技巧可以对其他人有所帮助。


做同样的事情。
Stefan Falk,

1

可以user在除模式之外的模式中创建表public。这个例子:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.