In PostgreSQL kann keine Datenbanktabelle mit dem Namen 'user' erstellt werden


90

Es scheint, dass PostgreSQL es nicht erlaubt, eine Datenbanktabelle mit dem Namen 'user' zu erstellen. Mit MySQL kann eine solche Tabelle erstellt werden.

Ist das, weil es ein Schlüsselwort ist? Hibernate kann jedoch kein Problem identifizieren (selbst wenn wir PostgreSQLDialect festlegen).


2
Ja, Benutzer ist ein reserviertes Schlüsselwort. Verwenden Sie es einfach nicht als Tabellennamen. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

Sie können unter postgreSQL eine Tabelle mit dem Namen 'user' erstellen. Aber ich rate Ihnen, die Verwendung von Tabellen- / Spalten- / Variablennamen zu vermeiden ... Namen mit Token-Schlüsselwörtern
Houari

Es tut uns leid, dass dies keine doppelte Frage ist. Bei der Frage geht es um Postgresql, nicht um etwas mit MySql. Vielen Dank.
Channa

Antworten:


136

user ist ein reserviertes Wort und es ist normalerweise keine gute Idee, reservierte Wörter für Bezeichner (Tabellen, Spalten) zu verwenden.

Wenn Sie darauf bestehen, müssen Sie den Tabellennamen in doppelte Anführungszeichen setzen:

create table "user" (...);

Dann müssen Sie jedoch immer doppelte Anführungszeichen verwenden, wenn Sie auf die Tabelle verweisen. Zusätzlich unterscheidet der Tabellenname dann zwischen Groß- und Kleinschreibung. "user"ist ein anderer Tabellenname als"User" .

Wenn Sie sich viel Ärger ersparen möchten, verwenden Sie einen anderen Namen. users,user_account , ...

Weitere Details zu den angegebenen Bezeichnern finden Sie im Handbuch: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


Leider ist dies keine Antwort in einem Hibernate-basierten Projekt, wie der Themenstarter erwähnte =) Das eigentliche Problem hier ist, dass Hibernate diese Art der automatischen Flucht nicht ausführt. Trotz des richtigen Dialekts! Die richtige Antwort sollte also beschreiben, wie man in Hibernate und nicht in PSQL arbeitet :(
Maksim Gumerov

2
@MaksimGumerov: Die richtige Antwort lautet: Verwenden Sie keine Namen, für die Anführungszeichen in Anführungszeichen erforderlich sind - unabhängig von der verwendeten Verschleierungsschicht.
a_horse_with_no_name

Nein, das ist nicht das Richtige :) Am Ende binden Sie Ihren Code an eine bestimmte Datenbank und deren Schlüsselwörter (und dieses Set kann sich ändern). Eine tatsächliche Lösung besteht darin, global zu entkommen (habe es aber nicht selbst versucht), eine andere besteht darin, Dialektanalysatoren im Ruhezustand zu verwenden (aber wie wir sehen, tun sie nicht immer ihre Aufgabe, um festzustellen, ob wir etwas entkommen müssen).
Maksim Gumerov

@MaksimGumerov Der Punkt ist, dass Sie die Tabelle mit dem Namen user nicht erstellen können, da sie von der Datenbank reserviert wird.
IamDOM

Klar kann ich - zum einen mit Anführungszeichen. Vielleicht sollte ich nicht, aber auch das ist fraglich. Was wichtiger ist, ist, wie ich eine solche Tabelle erstelle, und die hier vorgeschlagene Lösung (eine mit Angebot) hilft in Hibernate-Projekten nicht. In der ersten Frage wird der Ruhezustand erwähnt, sodass die Antwort IMO nicht gut genug beantwortet.
Maksim Gumerov

17

Es ist möglich, Tabellennamen mit JPA mit der nächsten Syntax anzugeben:

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

Das hat mein Problem gelöst. Ohne das bekam ich Fehler wiecolumn user0_.id does not exist
James Freitas

7

Wir hatten vor einiger Zeit dasselbe Problem und haben gerade den Tabellennamen von userin geändert app_user. Aufgrund der Verwendung von Hibernate / JPA. Wir dachten, es wäre auf diese Weise einfacher. Hoffe, diese kleine Lösung wird jemand anderem helfen.


Hab das Gleiche getan.
Anzeigename

0

Man kann eine userandere Tabelle im Schema als erstellen public. Das Beispiel:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.