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

vngu2lb8  于 2023-04-12  发布在  PostgreSQL
关注(0)|答案(5)|浏览(146)

PostgreSQL似乎不允许创建一个名为“user”的数据库表。但MySQL允许创建这样的表。
是因为它是一个关键字吗?但是Hibernate不能识别任何问题(即使我们设置了PostgreSQL Dialect)。

iswrvxsc

iswrvxsc1#

user是一个保留字,通常对标识符(表,列)使用保留字不是一个好主意。
如果你坚持这样做,你必须把表名放在双引号中:

create table "user" (...);

但是在引用表的时候,你总是需要使用双引号。另外,表名是区分大小写的。"user""User"是不同的表名。
如果你想保存很多麻烦,请使用不同的名称。usersuser_account,...
有关引用标识符的更多详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

e5nqia27

e5nqia272#

可以使用以下语法指定JPA的tablename:

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

mwg9r5ms3#

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

syqv5f0l

syqv5f0l4#

尾下划线_

SQL标准 * 明确 * 承诺在任何关键字或保留字中永远不会使用尾随下划线(U+005 F LOW LINE)。
因此,为了避免与各种数据库引擎使用的超过1000个关键字和保留字中的任何一个发生冲突,我在所有数据库标识符的后面都加上了下划线。(是的,真的,超过1000个保留字-我数过了。)
更改此:

CREATE TABLE user ( … ) ;

...到这个:

CREATE TABLE user_ ( … ) ;

我习惯于对所有数据库名称这样做:模式、表、列、索引等。
我知道我已经消除了由命名冲突引起的一类bug和问题,这让我轻松了一些。
作为一个额外的好处,当引用名为user的编程语言变量与数据库列user_时,这种做法在文档,电子邮件等中非常清楚。任何带有下划线的内容显然都是来自数据库端。

wpcxdonn

wpcxdonn5#

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

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

相关问题