反思postgresql 8.3以查找外键
我试图内省postgres 8.3数据库,以检索其详细信息 外键。假设我有以下模式:反思postgresql 8.3以查找外键,sql,postgresql,foreign-keys,introspection,Sql,Postgresql,Foreign Keys,Introspection,我试图内省postgres 8.3数据库,以检索其详细信息 外键。假设我有以下模式: CREATE TABLE "a" ( "id" SERIAL PRIMARY KEY ); CREATE TABLE "b" ( "one" integer, "two" integer, "a_id" integer REFERENCES "a", PRIMARY KEY ("one", "two") ); CREATE TABLE "c" ( "id" SERIAL PRIMARY KEY,
CREATE TABLE "a" (
"id" SERIAL PRIMARY KEY
);
CREATE TABLE "b" (
"one" integer,
"two" integer,
"a_id" integer REFERENCES "a",
PRIMARY KEY ("one", "two")
);
CREATE TABLE "c" (
"id" SERIAL PRIMARY KEY,
"a_id" integer REFERENCES "a",
"b_one" integer,
"b_two" integer,
FOREIGN KEY ("b_one", "b_two") REFERENCES "b"
);
然后我想运行一个查询,该查询产生以下结果:
table | columns | foreign table | foreign columns
--------------------------------------------------------
b | {a_id} | a | {id}
c | {a_id} | a | {id}
c | {b_one, b_two} | b | {one, two}
我最初的努力给了我疑问
SELECT conrelid::regclass as "table",
conkey as columns,
confrelid::regclass as "foreign table",
confkey as "foreign columns"
FROM pg_constraint
WHERE contype = 'f' ;
table | columns | foreign table | foreign columns
-------+---------+---------------+-----------------
b | {3} | a | {1}
c | {2} | a | {1}
c | {3,4} | b | {1,2}
就快到了。但是我将列号转换为列号的努力
名字还没有给我提供想要的结果。谷歌给了我
下面的是同样的,不太正确
SELECT conrelid::regclass as "table",
a.attname as columns,
confrelid::regclass as "foreign table",
af.attname as "foreign columns"
FROM pg_attribute AS af,
pg_attribute AS a,
( SELECT conrelid,
confrelid,
conkey[i] AS conkey,
confkey[i] as confkey
FROM ( SELECT conrelid,
confrelid,
conkey,
confkey,
generate_series(1, array_upper(conkey, 1)) AS i
FROM pg_constraint
WHERE contype = 'f'
) AS ss
) AS ss2
WHERE af.attnum = confkey
AND af.attrelid = confrelid
AND a.attnum = conkey
AND a.attrelid = conrelid ;
table | columns | foreign table | foreign columns
-------+---------+---------------+-----------------
b | a_id | a | id
c | a_id | a | id
c | b_one | b | one
c | b_two | b | two
有人能帮我做最后一步吗
SELECT table, array_agg(columns), foreign_table, array_agg(foreign_columns) FROM (your query here) GROUP BY table, foreign_table;
数组_agg需要PostgreSQL 8.4。对于早期版本,您可以定义自己的(在文档中查找array_accum)。显然,您可以将这个查询合并到您的大查询中,但这应该会给您一个大致的想法
数组_agg需要PostgreSQL 8.4。对于早期版本,您可以定义自己的(在文档中查找array_accum)。显然,您可以将这个查询合并到您的大查询中,但这应该会给您一个大致的想法。充实Peter Eisentrut的答案;对于postgresql 8.3,数组 函数可以定义为
CREATE AGGREGATE array_accum (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
然后得到我想要的答案的完整查询变成
SELECT "table",
array_accum(columns) AS columns,
"foreign table",
array_accum("foreign columns") AS "foreign columns"
FROM ( SELECT conrelid::regclass AS "table",
a.attname as columns,
confrelid::regclass as "foreign table",
af.attname as "foreign columns"
FROM pg_attribute AS af,
pg_attribute AS a,
( SELECT conrelid,
confrelid,
conkey[i] AS conkey,
confkey[i] as confkey
FROM ( SELECT conrelid,
confrelid,
conkey,
confkey,
generate_series(1, array_upper(conkey, 1)) AS i
FROM pg_constraint
WHERE contype = 'f'
) AS ss
) AS ss2
WHERE af.attnum = confkey
AND af.attrelid = confrelid
AND a.attnum = conkey
AND a.attrelid = conrelid
) AS ss3
GROUP BY "table",
"foreign table";
请原谅对他的回答的非标准评论方式,我还在学习
如何使用Stackoverflow,并且在第一次创建帐户时
实例并没有起到任何作用。充实了彼得·艾森特的答案;对于postgresql 8.3,数组 函数可以定义为
CREATE AGGREGATE array_accum (anyelement)
(
sfunc = array_append,
stype = anyarray,
initcond = '{}'
);
然后得到我想要的答案的完整查询变成
SELECT "table",
array_accum(columns) AS columns,
"foreign table",
array_accum("foreign columns") AS "foreign columns"
FROM ( SELECT conrelid::regclass AS "table",
a.attname as columns,
confrelid::regclass as "foreign table",
af.attname as "foreign columns"
FROM pg_attribute AS af,
pg_attribute AS a,
( SELECT conrelid,
confrelid,
conkey[i] AS conkey,
confkey[i] as confkey
FROM ( SELECT conrelid,
confrelid,
conkey,
confkey,
generate_series(1, array_upper(conkey, 1)) AS i
FROM pg_constraint
WHERE contype = 'f'
) AS ss
) AS ss2
WHERE af.attnum = confkey
AND af.attrelid = confrelid
AND a.attnum = conkey
AND a.attrelid = conrelid
) AS ss3
GROUP BY "table",
"foreign table";
请原谅对他的回答的非标准评论方式,我还在学习
如何使用Stackoverflow,并且在第一次创建帐户时
实例并没有起到任何作用