Перекрытие 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 и забудьте о необходимости заключать в кавычки идентификаторы.