无法在PostgreSQL中创建名为"user"的数据库表

Cha*_*nna 70 postgresql hibernate reserved-words identifier

似乎PostgreSQL不允许创建名为"user"的数据库表.但MySQL将允许创建这样的表.

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

a_h*_*ame 111

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

如果你坚持这样做,你必须把表名放在双引号中:

create table "user" (...);
Run Code Online (Sandbox Code Playgroud)

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

如果你想节省很多麻烦,请使用其他名称.users,user_account,...

有关引用标识符的更多详细信息,请参见手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

  • @MaksimGumerov:正确的答案是:不要使用需要带引号的标识符的名称 - 无论您使用的是什么混淆层。 (3认同)

Bas*_*que 18

尾随下划线_

\n

SQL 标准明确承诺永远不会在任何名称、关键字或保留字中使用尾随下划线(U+005F LOW LINE)。要亲自查看,请在规范中搜索单词 \xe2\x80\x9cunderscore\xe2\x80\x9d。

\n

因此,为了避免与各种数据库引擎使用的一千多个关键字和保留字发生冲突,我用尾随下划线命名所有数据库标识符。(是的,确实有一千多个保留关键字\xe2\x80\x94\xc2\xa0我数了一下。)

\n

改变这个:

\n
CREATE TABLE user ( \xe2\x80\xa6 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

\xe2\x80\xa6 为:

\n
CREATE TABLE user_ ( \xe2\x80\xa6 ) ;\n
Run Code Online (Sandbox Code Playgroud)\n

我对所有数据库名称都这样做:模式、表、列、索引等。

\n

知道我\xe2\x80\x99 已经消除了一整类由命名冲突引起的错误和问题,我就放心了一些。

\n

作为一个额外的好处,当引用名为user与数据库列 的编程语言变量时,这种做法在文档、电子邮件等中非常清楚user_。任何带有下划线结尾的内容显然都是来自数据库端。

\n

  • 这就是该领域的真实经验 (5认同)

mnv*_*mnv 14

可以使用JPA指定tablename,并使用下一个语法:

@Table(name="\"user\"")
Run Code Online (Sandbox Code Playgroud)

  • 这个对我有用,很奇怪,用户是一个保留字,因为它被用作我在整个职业生涯中使用过的几乎每个应用程序的表名。 (4认同)

Ser*_* A. 9

我们有同样的问题以前,我们只是从改变表名userapp_user。由于使用了 Hibernate/JPA。我们认为这样会更容易。希望这个小修复能帮助别人。


Ale*_*lin 6

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

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Run Code Online (Sandbox Code Playgroud)