系统和本地数据库表名称中的Postgres重叠

时间:2017-08-06 17:11:49

标签: sql postgresql postico

我遇到了一个奇怪的问题,我在本地数据库中有一个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;

1 个答案:

答案 0 :(得分:1)

USER保留 key words for PostgreSQL之一。它也保留给SQL 2011,2008和92.

来自文档:

  

SQL区分保留和非保留关键字。根据标准,保留关键词是唯一真正的关键词;它们永远不会被允许作为标识符。

强调我的

也就是说,如果您想避免麻烦,请不要使用user作为标识符(即:它不应该是表的名称,列,索引,或者约束,或函数,...)。

如果你还想尝试:

  

作为一般规则,如果您为包含任何列出的关键字作为标识符的命令出现虚假解析器错误,您应该尝试引用标识符以查看问题是否消失。 / p>

即尝试:

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标准,并忘记必须引用标识符。