【error】postgresql relation does not exist
最近剛剛使用postgresql遇到很多問題。
postgresql relation does not exist
使用postgresql 查詢 AAA 資料表時,提示 postgresql relation does not exist ,可是
SELECT tablename FROM pg_tables;
AAA 表是存在的,好奇怪。
搜尋之後發現,是因為引號的問題。PostgreSQL本身大小寫不敏感,如果你要新建一個大寫字母的表,必須使用引號,同樣如果你要查詢也必須加引號。
select * from "AAA";
最近開發一個WEB的ETL工具需要用到不同的資料來源。第一次用POSTGRESQL發現一個雙引號引發的問題:
標準的SQL是不區分大小寫的。但是PostgreSQL對於資料庫中物件的名字允許使用支援大小寫區分的定義和引用方法。方式就是在DDL中用雙引號把希望支援大小的物件名括起來。
比如希望建立一個叫AAA的表。如果用CREATE TABLE AAA (…);的話,創建出來的表實際上是aaa。
如果希望建立大寫的AAA表的話,就需要用CREATE TABLE “AAA” (…);這種雙引號的方式定義物件名。
這樣寫的缺點是查詢語句必須也使用雙引號的方式引用物件名。比如SELECT * FROM “AAA”;否則PostgreSQL預設會去找aaa這個物件,然後返回aaa不存在的錯誤。需要注意的是不僅僅是表可以這樣定義和引用,對PostgreSQL中的任意物件(比如列名,索引名等)都有效。
實際上傳統的SQL都是不區分大小寫的,所以只要DDL和DLL按照傳統(不使用雙引號)的方式操作資料庫物件不會有任何問題。問題出在如果表是通過PostgreSQL的pgAdmin III 工具建立的話,預設是按照有雙引號的方式建立物件的,所以DLL裡面必須也要按照有雙引號的方式使用。但是這種寫法不是標準的,如果是通過一些通用庫函式訪問資料庫的話,會不被支援。
建議:
1.不推薦使用pgAdmin III這個工具建立資料庫物件。還是應該手工編寫DDL語句。
2.不推薦在DDL裡用雙引號的方式建立區分大小寫的物件。
3.PostgreSQL給出的建議是SQL的key word用大寫,其他的名稱全部使用小寫。