Nie można utworzyć tabeli bazy danych o nazwie „user” w PostgreSQL


99

Wygląda na to, że PostgreSQL nie pozwala na utworzenie tabeli bazy danych o nazwie „user”. Ale MySQL pozwoli stworzyć taką tabelę.

Czy to dlatego, że jest to słowo kluczowe? Ale Hibernate nie może zidentyfikować żadnego problemu (nawet jeśli ustawimy PostgreSQLDialect).


2
Tak, użytkownik jest zastrzeżonym słowem kluczowym. Po prostu nie używaj go jako nazwy tabeli. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

Możesz utworzyć tabelę o nazwie „user” na postgreSQL. Ale radzę unikać używania tabeli / kolumny / zmiennych ... nazw używających tokenowych słów kluczowych
Houari

Przykro mi, że to nie jest powtórzone pytanie. Pytanie dotyczy postgresql, a nie czegoś z MySql. Dzięki.
Channa

Odpowiedzi:


147

user jest słowem zastrzeżonym i zwykle nie jest dobrym pomysłem używanie słów zastrzeżonych jako identyfikatorów (tabel, kolumn).

Jeśli nalegasz na zrobienie tego, musisz umieścić nazwę tabeli w podwójnych cudzysłowach:

create table "user" (...);

Ale wtedy zawsze musisz używać podwójnych cudzysłowów podczas odwoływania się do tabeli. Dodatkowo w nazwie tabeli rozróżniana jest wielkość liter. "user"to inna nazwa tabeli niż "User".

Jeśli chcesz zaoszczędzić sobie wielu kłopotów, użyj innej nazwy. users,, user_account...

Więcej szczegółów na temat cytowanych identyfikatorów można znaleźć w podręczniku: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


Niestety nie jest to odpowiedź w projekcie opartym na Hibernate, jak wspomniano w topicstarter =). Rzeczywistym problemem jest to, że Hibernate nie robi tego rodzaju automatycznego ucieczki. Pomimo, że powiedziano mu właściwy dialekt! Tak więc prawidłowa odpowiedź powinna
brzmieć

3
@MaksimGumerov: prawidłowa odpowiedź brzmi: nie używaj nazw, które wymagają cudzysłowów - niezależnie od używanej warstwy zaciemniania.
a_horse_with_no_name

Nie, to nie ten :) Skończysz z wiązaniem kodu z konkretną bazą danych i jej słowami kluczowymi (a ten zestaw może ulec zmianie). Jednym z rzeczywistych rozwiązań jest włączenie ucieczki globalnej (chociaż sam tego nie próbowałem), innym jest poleganie na analizatorach dialektu Hibernate (ale jak widzimy, nie zawsze wykonują one swoją pracę, określając, czy musimy przed czymś uciec).
Maksim Gumerov

@MaksimGumerov chodzi o to, że nie możesz utworzyć tabeli o nazwie user, ponieważ jest ona zarezerwowana przez bazę danych.
IamDOM

Jasne, że mogę - na przykład używając cytatów. Może nie powinienem, ale nawet to jest dyskusyjne. Ważniejsze jest to, JAK stworzyć taką tabelę, a zaproponowane tutaj rozwiązanie (takie z cytatem) nie pomoże w projektach Hibernate. Pierwsze pytanie dotyczy Hibernate, więc odpowiedź faktycznie nie odpowiada na nie wystarczająco dobrze IMO.
Maksim Gumerov

18

Możliwe jest określenie nazwy tabeli za pomocą JPA z następującą składnią:

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

To rozwiązało mój problem. Bez tego otrzymywałem błędy takie jakcolumn user0_.id does not exist
James Freitas

7

Mieliśmy ten sam problem już dawno i właśnie zmieniliśmy nazwę tabeli z userna app_user. Dzięki wykorzystaniu Hibernate / JPA. Myśleliśmy, że w ten sposób będzie łatwiej. Mam nadzieję, że ta mała poprawka pomoże komuś innemu.


Zrobiłem to samo.
Stefan Falk

2

Można stworzyć tabelę userw innym schemacie niż public. Przykład:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.