Postgresql
Postgres中數組列的內部連接
在 Postgres 9.4中,我試圖提取
UNIQUE
Postgres 中給定表的約束中涉及的所有列的名稱。看起來這些列的名稱包含在
pg_constraint
. 根據文件,與我的問題相關的列被稱為conkey
,它恰好是一個int
s 數組。關鍵是,我提出的查詢給了我錯誤的結果,我很確定這是因為我
conkey
以錯誤的方式加入。查詢如下:SELECT pg_attribute.attname, pg_constraint.* FROM pg_attribute INNER JOIN pg_constraint ON pg_attribute.attnum = ANY (pg_constraint.conkey) WHERE pg_constraint.conrelid = ( SELECT oid FROM pg_class WHERE relname LIKE 'test_table' ) AND pg_constraint.contype = 'u'; -- to filter out non-unique constraints
這是一個用於快速複製的表 DDL:
CREATE TABLE "test_table" ( "date" date DEFAULT now() NOT NULL, "foo" varchar COLLATE "default" NOT NULL CONSTRAINT "test_table_foo_key" UNIQUE ("foo") ) WITH (OIDS=FALSE); ALTER TABLE "test_table" OWNER TO "postgres";
現在,誰能告訴我我做錯了什麼?有沒有更簡單的方法來獲得我想要的資訊?
我正在嘗試檢索受約束表的名稱,因為我正在編寫的應用程序需要解決
UPSERT
Postgres 目前缺乏的問題。這個想法是使用 CTE 進行插入或更新,但由於我事先不知道受約束的列是什麼,所以我需要做一些自省。
你有一半錯過了兩張桌子之間的聯繫。列
...relid
也必須匹配:SELECT attname, c.* FROM pg_attribute a JOIN pg_constraint c ON attrelid = conrelid -- this was missing AND attnum = ANY (conkey) WHERE attrelid = 'test_table'::regclass;