我有这个架构:
create table "cat" (
"name" varchar(64),
"owner" varchar(64),
primary key ("name", "owner")
);
create table "comment" (
"name" varchar(45),
"owner" varchar(45),
"id" uuid,
"comment" text,
primary key ("id"),
foreign key ("name", "owner") references "cat"("name", "owner")
);
我想获得从表“comment”到“cat”的外键列表,所以我使用:
SELECT
tc.constraint_name, tc.table_name, kcu.column_name,
ccu.table_name AS foreign_table_name,
ccu.column_name AS foreign_column_name
FROM
information_schema.table_constraints AS tc
JOIN information_schema.key_column_usage AS kcu
ON tc.constraint_name = kcu.constraint_name
JOIN information_schema.constraint_column_usage AS ccu
ON ccu.constraint_name = tc.constraint_name
WHERE constraint_type = 'FOREIGN KEY'
;
几乎得到了我想要的:
constraint_name | table_name | column_name | foreign_table_name | foreign_column_name
-------------------+------------+-------------+--------------------+---------------------
comment_name_fkey | comment | owner | cat | name
comment_name_fkey | comment | name | cat | name
comment_name_fkey | comment | owner | cat | owner
comment_name_fkey | comment | name | cat | owner
但是有第 1 行和第 4 行,我想在结果中删除它们,因为它不反射(reflect)列的依赖关系。我如何在 Postgresql 中执行此操作?
最佳答案
我认为你不能仅使用 information_schema
来做到这一点,但你可以直接查询表来做到这一点:
SELECT conname AS constraint_name, conrelid::regclass AS table_name, ta.attname AS column_name,
confrelid::regclass AS foreign_table_name, fa.attname AS foreign_column_name
FROM (
SELECT conname, conrelid, confrelid,
unnest(conkey) AS conkey, unnest(confkey) AS confkey
FROM pg_constraint
WHERE conname = 'comment_name_fkey'
--and contype = 'f'
) sub
JOIN pg_attribute AS ta ON ta.attrelid = conrelid AND ta.attnum = conkey
JOIN pg_attribute AS fa ON fa.attrelid = confrelid AND fa.attnum = confkey
结果
constraint_name | table_name | column_name | foreign_table_name | foreign_column_name
-------------------+------------+-------------+--------------------+---------------------
comment_name_fkey | comment | name | cat | name
comment_name_fkey | comment | owner | cat | owner
关于Postgresql查询获取外键多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46032438/