无法在 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 中的数据