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

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

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

87684 次浏览

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

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

create table "user" (...);

但是 一直都是在引用表时需要使用双引号。此外,表名也是区分大小写的。"user"是与 "User"不同的表名。

如果你想为自己省去很多麻烦,就换个名字。

关于引用标识符的更多细节可以在手册中找到: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

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

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

我们以前遇到过同样的问题,我们只是将表名从 user改为 app_user。由于使用了 Hibernate/JPA。我们以为这样会容易些。 希望这个小方法能帮到别人。

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

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

后跟下划线

SQL 标准 明确地承诺不在任何关键字或保留字中使用尾随下划线。

因此,为了避免与各种数据库引擎使用的上千个关键字和保留字中的任何一个发生冲突,我将所有数据库标识符命名为带有尾部下划线。(是的,真的,保留了一千多个关键词ーー我数过了。)

改变这一点:

CREATE TABLE user ( … ) ;

变成这样:

CREATE TABLE user_ ( … ) ;

这是我对所有数据库名称(模式、表、列、索引等)的习惯。

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