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).

Channa
źródło
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

koń bez imienia
źródło
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\"")
Nacięcie
źródło
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.

Sergio A.
źródło
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(...);
AlexElin
źródło