我遇到了一个奇怪的问题,我的本地数据库中有一个user
表,当我尝试使用 Postico 运行 SQL 查询时,它似乎与 postgres 系统表user
重叠。当我对我的数据库运行查询时,我返回了一个映射到访问数据库的用户名的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;
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标准,而忘记必须引用标识符。