【问题标题】:Cannot create a database table named 'user' in PostgreSQL无法在 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 的一些事情。谢谢。

标签: postgresql hibernate identifier reserved-words


【解决方案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(...);

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2013-06-02
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多