No se puede crear una tabla de base de datos llamada 'usuario' en PostgreSQL

94

Parece que PostgreSQL no permite crear una tabla de base de datos llamada 'usuario'. Pero MySQL permitirá crear dicha tabla.

¿Es eso porque es una palabra clave? Pero Hibernate no puede identificar ningún problema (incluso si configuramos PostgreSQLDialect).

Channa
fuente
2
Sí, el usuario es una palabra clave reservada. Simplemente no lo use como nombre de tabla. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet
Puede crear una tabla llamada 'usuario' en postgreSQL. Pero le aconsejo que evite el uso de tablas / columnas / variables ... nombres que usan palabras clave de token
Houari
Lo siento, esta no es una pregunta duplicada. La pregunta es sobre postgresql, no sobre algo con MySql. Gracias.
Channa

Respuestas:

145

user es una palabra reservada y generalmente no es una buena idea usar palabras reservadas para identificadores (tablas, columnas).

Si insiste en hacer eso, debe poner el nombre de la tabla entre comillas dobles:

create table "user" (...);

Pero siempre es necesario utilizar comillas dobles al hacer referencia a la tabla. Además, el nombre de la tabla distingue entre mayúsculas y minúsculas. "user"es un nombre de tabla diferente al "User".

Si quiere ahorrarse muchos problemas, utilice un nombre diferente. users,, user_account...

Se pueden encontrar más detalles sobre los identificadores entre comillas en el manual: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

un caballo sin nombre
fuente
Desafortunadamente, esta no es una respuesta en un proyecto basado en Hibernate, como mencionó el topicstarter =) El problema real aquí es que Hibernate no logra hacer ese tipo de escape automáticamente. ¡A pesar de que le dijeron el dialecto adecuado! Entonces, la respuesta adecuada debería decir describe cómo hacer que funcione en Hibernate, no en PSQL :(
Maksim Gumerov
3
@MaksimGumerov: la respuesta correcta es: no use nombres que requieran identificadores entre comillas, independientemente de la capa de ofuscación que esté usando.
a_horse_with_no_name
No, ese no es el indicado :) Terminará vinculando su código a una base de datos específica y sus palabras clave (y este conjunto está sujeto a cambios). Una solución real es activar el escape global (aunque no lo probé yo mismo), otra es confiar en los analizadores de dialectos de Hibernate (pero, como vemos, no siempre hacen su trabajo para determinar si necesitamos escapar de algo).
Maksim Gumerov
@MaksimGumerov el punto es que no puede crear la tabla llamada usuario porque está reservada por la base de datos.
IamDOM
Claro que puedo, usando comillas, por ejemplo. Quizás no debería, pero incluso eso es discutible. Lo que es más importante es CÓMO creo una tabla de este tipo, y la solución propuesta aquí (una con cotización) no ayudará en los proyectos de Hibernate. Y la pregunta inicial menciona a Hibernate, por lo que la respuesta en realidad no responde lo suficientemente bien en mi opinión.
Maksim Gumerov
18

Es posible especificar el nombre de la tabla con JPA con la siguiente sintaxis:

@Table(name="\"user\"")
mnv
fuente
Eso resolvió mi problema. Sin eso, recibía errores comocolumn user0_.id does not exist
James Freitas
7

Tuvimos el mismo problema hace un tiempo y simplemente cambiamos el nombre de la tabla de usera app_user. Debido al uso de Hibernate / JPA. Pensamos que sería más fácil de esta manera. Espero que esta pequeña solución ayude a alguien más.

Sergio A.
fuente
Hizo lo mismo.
Stefan Falk
1

Se puede crear una tabla useren el esquema que no sea public. El ejemplo:

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