Не вдається створити таблицю бази даних з іменем "користувач" у PostgreSQL


93

Здається, PostgreSQL не дозволяє створювати таблицю бази даних з іменем "користувач". Але MySQL дозволить створити таку таблицю.

Це тому, що це ключове слово? Але Hibernate не може визначити жодної проблеми (навіть якщо ми встановили PostgreSQLDialect).


2
Так, користувач - це зарезервоване ключове слово. Тільки не використовуйте його як назву таблиці. postgresql.org/docs/9.3/static/sql-keywords-appendix.html
JB Nizet

Ви можете створити таблицю з ім'ям "користувач" на postgreSQL. Але я раджу вам уникати використання таблиць / стовпців / змінних ... імен із використанням маркерних ключових слів
Houari

На жаль, це питання не повторюється. Питання в postgresql, а не в чомусь із MySql. Дякую.
Channa

Відповіді:


142

user є зарезервованим словом, і зазвичай не є гарною ідеєю використовувати зарезервовані слова для ідентифікаторів (таблиць, стовпців).

Якщо ви наполягаєте на цьому, вам слід поставити назву таблиці у подвійні лапки:

create table "user" (...);

Але тоді вам завжди потрібно використовувати подвійні лапки при посиланні на таблицю. Крім того, назва таблиці тоді чутлива до регістру. "user"- це інша назва таблиці, ніж "User".

Якщо ви хочете заощадити собі багато клопоту, використовуйте інше ім’я. users, user_account...

Детальніше про цитовані ідентифікатори можна знайти в посібнику: http://www.postgresql.org/docs/current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS


На жаль, це не відповідь у проекті, заснованому на режимі Hibernate, про що згадував topicstarter =) Фактична проблема полягає в тому, що Hibernate не робить такого втечі автоматично. Незважаючи на те, що йому сказали правильний діалект! Тож правильна відповідь повинна говорити про те, як зробити роботу в режимі глибокого сну, а не в PSQL :(
Максим Гумеров,

3
@MaksimGumerov: правильна відповідь така: не використовуйте імена, для яких потрібні цитовані ідентифікатори - незалежно від шару забруднення, який ви використовуєте.
a_horse_with_no_name

Ні, це не той :) Ви в кінцевому підсумку прив’яжете свій код до певної бази даних та її ключових слів (і цей набір може бути змінений). Одне фактичне рішення - включити глобальний порятунок (хоча я не пробував сам), інше - покластися на аналізатори діалекту Hibernate (але, як ми бачимо, вони не завжди виконують свою роботу, визначаючи, чи потрібно нам щось уникати).
Максим Гумеров 20.03.18

@MaksimGumerov справа в тому, що ви не можете створити таблицю з іменем user, оскільки вона зарезервована базою даних.
IamDOM

Звичайно, я можу - використовуючи лапки, наприклад. Можливо, я не повинен, але навіть це суперечливо. Важливіше те, ЯК мені створити таку таблицю, і запропоноване тут рішення (таке з цитатами) не допоможе у проектах Hibernate. І у початковому запитанні згадується Hibernate, тому відповідь насправді не відповідає на нього досить добре IMO.
Максим Гумеров

18

Можна вказати ім'я таблиці за допомогою JPA з наступним синтаксисом:

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

Це вирішило мою проблему. Без цього я отримував такі помилки, якcolumn user0_.id does not exist
Джеймс Фрейтас

7

У нас була та сама проблема колись тому, і ми просто змінили назву таблиці userна app_user. Через використання Hibernate / JPA. Ми думали, що так буде простіше. Сподіваюся, це невелике виправлення допоможе комусь іншому.


Зробив те саме.
Стефан Фальк

1

У userсхемі можна створити таблицю, крім public. Приклад:

CREATE SCHEMA my_schema;
CREATE TABLE my_schema.user(...);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.