PostgreSQL似乎不允许创建一个名为“user”的数据库表。但MySQL允许创建这样的表。是因为它是一个关键字吗?但是Hibernate不能识别任何问题(即使我们设置了PostgreSQL Dialect)。
iswrvxsc1#
user是一个保留字,通常对标识符(表,列)使用保留字不是一个好主意。如果你坚持这样做,你必须把表名放在双引号中:
user
create table "user" (...);
但是在引用表的时候,你总是需要使用双引号。另外,表名是区分大小写的。"user"和"User"是不同的表名。如果你想保存很多麻烦,请使用不同的名称。users,user_account,...有关引用标识符的更多详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
"user"
"User"
users
user_account
e5nqia272#
可以使用以下语法指定JPA的tablename:
@Table(name="\"user\"")
mwg9r5ms3#
我们以前也遇到过同样的问题,我们只是将表名从user改为app_user。由于使用了Hibernate/JPA。我们认为这样会更容易。希望这个小修复可以帮助其他人。
app_user
syqv5f0l4#
_
SQL标准 * 明确 * 承诺在任何关键字或保留字中永远不会使用尾随下划线(U+005 F LOW LINE)。因此,为了避免与各种数据库引擎使用的超过1000个关键字和保留字中的任何一个发生冲突,我在所有数据库标识符的后面都加上了下划线。(是的,真的,超过1000个保留字-我数过了。)更改此:
CREATE TABLE user ( … ) ;
...到这个:
CREATE TABLE user_ ( … ) ;
我习惯于对所有数据库名称这样做:模式、表、列、索引等。我知道我已经消除了由命名冲突引起的一类bug和问题,这让我轻松了一些。作为一个额外的好处,当引用名为user的编程语言变量与数据库列user_时,这种做法在文档,电子邮件等中非常清楚。任何带有下划线的内容显然都是来自数据库端。
user_
wpcxdonn5#
您可以在public以外的架构中创建表user。示例:
public
CREATE SCHEMA my_schema; CREATE TABLE my_schema.user(...);
5条答案
按热度按时间iswrvxsc1#
user
是一个保留字,通常对标识符(表,列)使用保留字不是一个好主意。如果你坚持这样做,你必须把表名放在双引号中:
但是在引用表的时候,你总是需要使用双引号。另外,表名是区分大小写的。
"user"
和"User"
是不同的表名。如果你想保存很多麻烦,请使用不同的名称。
users
,user_account
,...有关引用标识符的更多详细信息,请参阅手册:http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
e5nqia272#
可以使用以下语法指定JPA的tablename:
mwg9r5ms3#
我们以前也遇到过同样的问题,我们只是将表名从
user
改为app_user
。由于使用了Hibernate/JPA。我们认为这样会更容易。希望这个小修复可以帮助其他人。syqv5f0l4#
尾下划线
_
SQL标准 * 明确 * 承诺在任何关键字或保留字中永远不会使用尾随下划线(U+005 F LOW LINE)。
因此,为了避免与各种数据库引擎使用的超过1000个关键字和保留字中的任何一个发生冲突,我在所有数据库标识符的后面都加上了下划线。(是的,真的,超过1000个保留字-我数过了。)
更改此:
...到这个:
我习惯于对所有数据库名称这样做:模式、表、列、索引等。
我知道我已经消除了由命名冲突引起的一类bug和问题,这让我轻松了一些。
作为一个额外的好处,当引用名为
user
的编程语言变量与数据库列user_
时,这种做法在文档,电子邮件等中非常清楚。任何带有下划线的内容显然都是来自数据库端。wpcxdonn5#
您可以在
public
以外的架构中创建表user
。示例: