2017-08-06 23 views
0

我遇到了一個奇怪的問題,我在我的本地數據庫中有一個user表,當我嘗試使用Postico運行SQL查詢時,這似乎與postgres系統表user重疊。當我對我的數據庫運行查詢時,我返回了一個current_user列,該列映射到訪問數據庫的用戶名。我應該更改我的SQL以指向本地數據庫用戶表?系統和本地數據庫Postgres重疊表名

SQL命令我試圖運行:

SELECT * 
FROM user 
; 

返回current_user: johndoe

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

回答

1

USER的一個保留key words for 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標準,並忘了不得不引用標識符。

+0

謝謝你的解釋。這非常有幫助,我同意,我應該爲我的桌子選擇一個新名字。 – cphill