Невозможно создать таблицу базы данных с именем 'user' в PostgreSQL


94

Похоже, PostgreSQL не позволяет создавать таблицу базы данных с именем «пользователь». Но MySQL позволит создать такую ​​таблицу.

Это потому, что это ключевое слово? Но Hibernate не может определить какую-либо проблему (даже если мы установили PostgreSQLDialect).


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

Вы можете создать таблицу с именем user в postgreSQL. Но я советую вам избегать использования имен таблиц / столбцов / переменных ... с использованием ключевых слов-токенов
Houari

Извините, это не повторяющийся вопрос. Вопрос в postgresql, а не в MySql. Спасибо.
Чанна

Ответы:


145

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

Если вы настаиваете на этом, вы должны заключить имя таблицы в двойные кавычки:

create table "user" (...);

Но тогда вам всегда нужно использовать двойные кавычки при обращении к таблице. Кроме того, имя таблицы чувствительно к регистру. "user"это другое имя таблицы, чем "User".

Если вы хотите избавить себя от множества проблем, используйте другое имя. users, user_account...

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


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

3
@MaksimGumerov: правильный ответ: не используйте имена, требующие идентификаторов в кавычках - независимо от того, какой уровень обфускации вы используете.
a_horse_with_no_name

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

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