Não é possível criar uma tabela de banco de dados chamada 'usuário' no PostgreSQL


99

Parece que o PostgreSQL não permite a criação de uma tabela de banco de dados chamada 'usuário'. Mas o MySQL permitirá a criação de tal tabela.

É porque é uma palavra-chave? Mas o Hibernate não consegue identificar nenhum problema (mesmo se definirmos o PostgreSQLDialect).


2
Sim, o usuário é uma palavra-chave reservada. Apenas não o use como um nome de tabela. postgresql.org/docs/9.3/static/sql-keywords-apataforma.html
JB Nizet

Você pode criar uma tabela chamada 'usuário' no postgreSQL. Mas eu aconselho você a evitar usar tabela / coluna / variáveis ​​... nomes usando palavras
Houari

Desculpe, esta não é uma pergunta duplicada. A questão é sobre o postgresql e não sobre alguma coisa com o MySql. Obrigado.
Channa

Respostas:


147

user é uma palavra reservada e geralmente não é uma boa ideia usar palavras reservadas para identificadores (tabelas, colunas).

Se você insiste em fazer isso, você deve colocar o nome da mesa entre aspas duplas:

create table "user" (...);

Mas então você sempre precisa usar aspas duplas ao fazer referência à tabela. Além disso, o nome da tabela diferencia maiúsculas de minúsculas. "user"é um nome de tabela diferente de "User".

Se você quiser evitar muitos problemas, use um nome diferente. users,, user_account...

Mais detalhes sobre os identificadores citados podem ser encontrados no manual: http://www.postgresql.org/docs/current/static/sql-syntax Budapical.html#SQL-SYNTAX-IDENTIFIERS


Infelizmente, esta não é uma resposta em um projeto baseado em Hibernate, como o topicstarter mencionou =) O problema real aqui é a falha do Hibernate em fazer esse tipo de escape automaticamente. Apesar de ter ouvido o dialeto correto! Portanto, a resposta adequada deve ser descrever como fazer no trabalho em Hibernate, não em PSQL :(
Maksim Gumerov

3
@MaksimGumerov: a resposta adequada é: não use nomes que exijam identificadores entre aspas - independentemente da camada de ofuscação que você está usando.
a_horse_with_no_name

Não, esse não é o único :) Você acabará amarrando seu código a um banco de dados específico e suas palavras-chave (e este conjunto está sujeito a alterações). Uma solução real é ativar o escape globalmente (mas não tentei), outra é contar com analisadores de dialeto do Hibernate (mas como vemos, eles nem sempre fazem seu trabalho para determinar se precisamos escapar de algo).
Maksim Gumerov

@MaksimGumerov o ponto é que você não pode criar a tabela chamada user porque ela é reservada pelo banco de dados.
IamDOM

Claro que posso - usando aspas, por exemplo. Talvez eu não devesse, mas mesmo isso é discutível. O que é mais importante é COMO eu crio tal tabela, e a solução proposta aqui (uma com aspas) não ajudará em projetos Hibernate. E a pergunta inicial menciona o Hibernate, então a resposta realmente não responde bem o suficiente IMO.
Maksim Gumerov

18

É possível especificar tablename com JPA com a próxima sintaxe:

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

Isso resolveu meu problema. Sem isso eu estava recebendo erros comocolumn user0_.id does not exist
James Freitas

7

Tivemos o mesmo problema há algum tempo e acabamos de alterar o nome da tabela de userpara app_user. Devido ao uso de Hibernate / JPA. Achamos que seria mais fácil assim. Espero que esta pequena correção ajude outra pessoa.


Fez a mesma coisa.
Stefan Falk

2

Pode-se criar uma tabela userno esquema diferente de public. O exemplo:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.