ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

是的,用户是保留关键字。只是不要将其用作表名。 postgresql.org/docs/9.3/static/sql-keywords-appendix.html
您可以在 postgreSQL 上创建一个名为“用户”的表。但我建议您避免使用表/列/变量...名称使用令牌关键字
很抱歉,这不是一个重复的问题。问题是关于 postgresql 而不是关于 MySql 的一些事情。谢谢。

k
krock

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 中:(
@MaksimGumerov:正确的答案是:不要使用需要引用标识符的名称 - 无论您使用的是什么混淆层。
不,那不是那个:) 您最终会将您的代码绑定到特定的数据库及其关键字(并且这组可能会发生变化)。一个实际的解决方案是打开全局转义(虽然我自己没有尝试过),另一个是依赖 Hibernate 方言分析器(但正如我们所见,它们并不总是在确定我们是否需要转义某些东西时完成他们的工作)。
@MaksimGumerov 的重点是您无法创建名为 user 的表,因为它是由数据库保留的。
我当然可以 - 使用引号,例如。也许我不应该,但即使这样也是有争议的。更重要的是我如何创建这样的表,这里提出的解决方案(带引号的)对 Hibernate 项目没有帮助。最初的问题提到了休眠,所以答案实际上并没有很好地回答 IMO。
N
Nick

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

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

这解决了我的问题。没有那个我得到像column user0_.id does not exist这样的错误
这个对我有用,很奇怪,用户是一个保留字,因为它被用作我在整个职业生涯中使用过的几乎每个应用程序的表名。
a
a_horse_with_no_name

我们之前也遇到过同样的问题,我们只是将表名从 user 更改为 app_user。由于使用了 Hibernate/JPA。我们认为这样会更容易。希望这个小修复对其他人有所帮助。


做了同样的事情。
A
AlexElin

您可以在 public 以外的架构中创建表 user。这个例子:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);