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

Posted

技术标签:

【中文标题】无法在 PostgreSQL 中创建名为“用户”的数据库表【英文标题】:Cannot create a database table named 'user' in PostgreSQL 【发布时间】:2014-04-10 22:57:20 【问题描述】:

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

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

【问题讨论】:

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

user 是一个保留字,对于标识符(表、列)使用保留字通常不是一个好主意。

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

create table "user" (...);

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

如果您想省去很多麻烦,请使用其他名称。 users, user_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 项目没有帮助。最初的问题提到了 Hibernate,所以答案实际上并没有很好地回答 IMO。【参考方案2】:

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

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

【讨论】:

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

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

【讨论】:

做了同样的事情。【参考方案4】:

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

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

【讨论】:

以上是关于无法在 PostgreSQL 中创建名为“用户”的数据库表的主要内容,如果未能解决你的问题,请参考以下文章

Django 中的项目:我无法在终端中创建超级用户来操作 Postgresql 中的数据

在 Postgresql 中创建一个不返回复合值的函数

如何在 PostgreSQL 中创建只读用户?

带有 Postgresql 的 Grails:无法在适当的模式中创建表

在 PostgreSQL 中创建/删除索引的用户权限

使用表中的列在 PostgreSQL 中创建视图