在 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
也必须匹配: