Перекрытие Postgres в имени таблицы системной и локальной БД

Я столкнулся со странной проблемой, где у меня есть user таблица в моей локальной БД, которая, кажется, перекрывается с системной таблицей postgres user когда я пытаюсь запустить SQL-запросы, используя Postico. Пока я выполняю запросы к моей базе данных, мне возвращается current_user столбец, который отображается на имя пользователя, обращающегося к БД. Что я должен изменить в моем SQL, чтобы указать на локальную таблицу пользователей БД?

SQL-команды, которые я пытаюсь запустить:

SELECT *
FROM user
;

возвращенныйcurrent_user: johndoe

UPDATE user
SET user.password = 'cryptopw', user.authentication_token = NULL
WHERE user.user_id = 210;

1 ответ

Решение

USER является одним из зарезервированных ключевых слов для PostgreSQL. Он также зарезервирован для SQL 2011, 2008 и 92.

Из документации:

SQL различает зарезервированные и незарезервированные ключевые слова. Согласно стандарту, зарезервированные ключевые слова являются единственными реальными ключевыми словами; они никогда не допускаются в качестве идентификаторов.

акцент мой

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

Если вы все еще хотите попробовать:

Как правило, если вы получаете ложные ошибки синтаксического анализатора для команд, которые содержат любое из перечисленных ключевых слов в качестве идентификатора, вы должны попытаться заключить в кавычки идентификатор, чтобы увидеть, исчезнет ли проблема.

То есть попробуйте:

SELECT
    *
FROM
    "user" ;

а также

UPDATE 
    "user"
SET 
    password = 'cryptopw',        -- not "user".password
    authentication_token = NULL   -- not "user". authentication_token
WHERE 
    "user".user_id = 210;         -- you can, but don't need "user"

Я бы на самом деле переименовал таблицу, назови ее my_user (или же application_user или что-то еще), следуйте стандарту SQL и забудьте о необходимости заключать в кавычки идентификаторы.

Другие вопросы по тегам