Impossibile creare una tabella di database denominata "utente" in PostgreSQL


94

Sembra che PostgreSQL non permetta di creare una tabella di database denominata "utente". Ma MySQL permetterà di creare una tabella del genere.

È perché è una parola chiave? Ma Hibernate non può identificare alcun problema (anche se impostiamo PostgreSQLDialect).


2
Sì, l'utente è una parola chiave riservata. Basta non usarlo come nome di una tabella. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

Puoi creare una tabella denominata "utente" su postgreSQL. Ma ti consiglio di evitare di usare tabelle / colonne / variabili ... nomi che usano parole chiave token
Houari

Mi dispiace tanto questa non è una domanda duplicata. La domanda riguarda postgresql, non qualcosa con MySql. Grazie.
Channa

Risposte:


145

user è una parola riservata e di solito non è una buona idea usare parole riservate per gli identificatori (tabelle, colonne).

Se insisti per farlo devi mettere il nome della tabella tra virgolette doppie:

create table "user" (...);

Ma poi devi sempre usare le virgolette doppie quando fai riferimento alla tabella. Inoltre, il nome della tabella fa distinzione tra maiuscole e minuscole. "user"è un nome di tabella diverso da "User".

Se vuoi risparmiarti un sacco di problemi usa un nome diverso. users,, user_account...

Maggiori dettagli sugli identificatori citati possono essere trovati nel manuale: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


Sfortunatamente questa non è una risposta in un progetto basato su Hibernate, come menzionato dal topicstarter =) Il vero problema qui è l'incapacità di Hibernate di fare quel tipo di fuga automaticamente. Nonostante sia stato detto il dialetto corretto! Quindi la risposta corretta dovrebbe dire descrivere come lavorare in Hibernate, non in PSQL :(
Maksim Gumerov

3
@MaksimGumerov: la risposta corretta è: non utilizzare nomi che richiedono identificatori tra virgolette, indipendentemente dal livello di offuscamento che stai utilizzando.
a_horse_with_no_name

No, non è quello :) Finirai per legare il tuo codice a un database specifico e alle sue parole chiave (e questo set è soggetto a modifiche). Una soluzione effettiva è attivare la fuga a livello globale (non l'ho provato io stesso però), un'altra è affidarsi agli analizzatori di dialetti Hibernate (ma come vediamo, non sempre fanno il loro lavoro nel determinare se abbiamo bisogno di sfuggire a qualcosa).
Maksim Gumerov

@MaksimGumerov il punto è che non puoi creare la tabella denominata user perché è riservata dal database.
IamDOM

Certo che posso - usando le virgolette, per esempio. Forse non dovrei, ma anche questo è discutibile. La cosa più importante è COME creo una tabella del genere e la soluzione qui proposta (una con citazione) non sarà di aiuto nei progetti Hibernate. E la domanda iniziale menziona Hibernate, quindi la risposta in realtà non risponde abbastanza bene IMO.
Maksim Gumerov,

18

È possibile specificare tablename con JPA con la sintassi successiva:

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

Questo ha risolto il mio problema. Senza quello stavo ottenendo errori comecolumn user0_.id does not exist
James Freitas l'

7

Abbiamo riscontrato lo stesso problema tempo fa e abbiamo appena cambiato il nome della tabella da usera app_user. A causa dell'uso di Hibernate / JPA. Abbiamo pensato che sarebbe stato più facile in questo modo. Spero che questa piccola soluzione possa aiutare qualcun altro.


Ha fatto la stessa cosa.
Stefan Falk

1

Si può creare una tabella usernello schema diverso da public. L'esempio:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.