似乎PostgreSQL不允许创建名为'user'的数据库表,但是MySQL可以创建这样的表。
这是因为'user'是一个关键词吗?但是Hibernate无法识别任何问题(即使我们设置了PostgreSQLDialect)。
似乎PostgreSQL不允许创建名为'user'的数据库表,但是MySQL可以创建这样的表。
这是因为'user'是一个关键词吗?但是Hibernate无法识别任何问题(即使我们设置了PostgreSQLDialect)。
user
是一个保留字,通常不建议将保留字用于标识符(如表名、列名)。
如果您坚持这样做,您必须将表名用双引号括起来:
create table "user" (...);
但是当引用表时,您总是需要使用双引号。此外,表名区分大小写。"user"
是不同于"User"
的表名。
如果您想节省很多麻烦,请使用其他名称。users
,user_account
,...
有关带引号的标识符的更多详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
可以使用下面的语法在JPA中指定表名:
@Table(name="\"user\"")
_
SQL标准明确承诺永远不会在任何名称、关键字或保留字中使用下划线(U+005F LOW LINE)。要自己查看,请搜索规范中的“下划线”一词。
因此,为避免与各种数据库引擎使用的超过一千个关键字和保留字之一发生冲突,我将所有数据库标识符命名为带有下划线的后缀。(是的,真的,我数了一下,超过一千个保留关键字——我数过了。)
将此更改为:
CREATE TABLE user ( … ) ;
...变成这样:
CREATE TABLE user_ ( … ) ;
对于所有数据库名称,包括模式、表、列、索引等,我都有一个习惯:这样做。
我感到更加轻松,因为我已经消除了由命名冲突引起的整个错误和问题类别。
作为额外的好处,这种做法在文档、电子邮件等方面非常清晰,当涉及到编程语言变量user
和数据库列user_
时,任何带有下划线的内容显然来自数据库方面。
我们曾经遇到过同样的问题,我们只是将表名从user
更改为app_user
,因为我们使用了Hibernate/JPA。我们认为这样做会更容易。
希望这个小修复能帮助其他人。
public
的模式中创建表格 user
。
例如:CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
type
用作数据库列名 - Basil Bourque