2011-08-31 65 views
12

我在我的postgresql數據庫的公共架構中創建了一個表Abc。根據文檔public應該是默認模式。如預期的那樣,search_path設置爲"$user",public。但以下故障:Postgresql:表名/模式混淆

select * from Abc 

這個調用失敗過:

select * from public.Abc 

兩個產生一個錯誤,指出relation ... does not exist。但這一個工作正常:

select * from public."Abc" 

我是一個經驗豐富的T-SQL開發人員,但新的postgresql。根據文檔,應該可以將「正常」的SQL與postgresql結合使用。但這對我來說不起作用。任何暗示我可能已經搞砸了!?

回答

9

PostgreSQL的默認爲小寫字母,同時區分大小寫與列/表名:

select * from public.Abc 

居然是:

select * from public.abc 

那是因爲你的表名爲ABC,所以它不能被發現

您可以通過引號來覆蓋此小寫行爲,因此「Abc」作爲Abc處理。

+3

我在PG世界中生活的一個很好的經驗法則是使用下劃線而不是像在Microsoft SQL Server中那樣使用駱駝案例。所以做fast_table而不是「FastTable」。我發現最低限度的額外報價令人討厭。儘管其他人可能會認爲下劃線是一樣的。但是我來自Oracle背景,所以我很喜歡它。 – Kuberchaun

5

不要信任混合大小寫。最好的理由是從不使用混合大小寫。 公共架構(大部分)是默認架構,可以省略。

+0

此建議的原因在於,當您的模型導出到另一個安裝時,您很快遇到問題,其他設置的case(in)靈敏度也會出現問題。 – wildplasser

6

這是正常的,如表和列對象名稱是區分大小寫的,除非你把它們放在雙引號」之間,這是標準的SQL行爲。

+0

只是爲了完整。我是否正確,SQL標準要求不帶引號的名稱應該與**大寫**引用等同的行爲相同?換句話說'Abc≡「ABC」'? –

+2

@Grzegorz:除非有引用,否則AFAIK,表名和列名應被標準化爲大寫字母; PostgreSQL,OTOH將名稱轉換爲小寫。 –