Postgresql

Postgres中數組列的內部連接

  • August 15, 2016

在 Postgres 9.4中,我試圖提取UNIQUEPostgres 中給定表的約束中涉及的所有列的名稱。

看起來這些列的名稱包含在pg_constraint. 根據文件,與我的問題相關的列被稱為conkey,它恰好是一個ints 數組。

關鍵是,我提出的查詢給了我錯誤的結果,我很確定這是因為我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";

現在,誰能告訴我我做錯了什麼?有沒有更簡單的方法來獲得我想要的資訊?

我正在嘗試檢索受約束表的名稱,因為我正在編寫的應用程序需要解決UPSERTPostgres 目前缺乏的問題。這個想法是使用 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;

引用自:https://dba.stackexchange.com/questions/98546