列出所有表的主键-Postgresql


14

是否有一个查询可以做到这一点?

我发现一些查询可以对一个表执行此操作,但是我无法对其进行修改,因此可以看到:

tablename | column | type

1
如果我问这个问题,我想知道一列在PK中的顺序位置(某些PK具有多于1列,顺序可能很重要)。
ypercubeᵀᴹ

Answers:


13

像这样:

select tc.table_schema, tc.table_name, kc.column_name
from information_schema.table_constraints tc
  join information_schema.key_column_usage kc 
    on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema and kc.constraint_name = tc.constraint_name
where tc.constraint_type = 'PRIMARY KEY'
  and kc.ordinal_position is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

此查询不仅显示主键也是唯一指标
米哈尔尼克拉斯

@MichałNiklas它没有。
dezso

1
@DarielPratama:条件tc.constraint_type = 'PRIMARY KEY'将仅显示主键。然而,每个主键由唯一indexe支持
a_horse_with_no_name

2
@a_horse_with_no_name我相信这是不正确的。position_in_unique_constraint指示FOREIGN键的位置,对于主键始终为null。正确的列是ordinal_position。在PG 9.4中测试。
greatvovan

1
@a_horse_with_no_name我已经批准了匿名用户建议的修改。不知道编辑是否会通过,其他人拒绝了。无论如何,请检查greatvovan的上述建议和评论。我认为它们是正确的,ordinal_position应该使用。该position_in_unique_constraint只FKS使用不为空。
ypercubeᵀᴹ

20

这是更准确的答案:

select tc.table_schema, tc.table_name, kc.column_name 
from  
    information_schema.table_constraints tc,  
    information_schema.key_column_usage kc  
where 
    tc.constraint_type = 'PRIMARY KEY' 
    and kc.table_name = tc.table_name and kc.table_schema = tc.table_schema
    and kc.constraint_name = tc.constraint_name
order by 1, 2;

您错过了and kc.constraint_name = tc.constraint_name零件,因此列出了所有约束。


2
当查询有效时,更重要的区别是缺少and kc.position_in_unique_constraint is not null部分。强烈建议您使用ANSI JOIN(虽然很多人认为这只是个问题)。
dezso 2012年

1

请也考虑这一点。这将生成用于更改所有表的脚本。

SELECT STRING_AGG(FORMAT('ALTER TABLE %s CLUSTER ON %s;', A.table_name, A.constraint_name), E'\n') AS SCRIPT
FROM
(
    SELECT      FORMAT('%s.%s', table_schema, table_name) AS table_name, constraint_name
    FROM        information_schema.table_constraints
    WHERE       UPPER(constraint_type) = 'PRIMARY KEY'
    ORDER BY    table_name 
) AS A;

问题不要求如何更改表格。
ypercubeᵀᴹ

1
我赞同@ypercubeᵀᴹ的说法。删除此答案,但不要气--参加导览,访问帮助中心并阅读“帮助我们帮助您”博客。至于回答一些没有问到的问题,我们已经做了很多次了:-)。ps欢迎来到论坛!
Vérace

1

我认为获取主键和外键应该这样做。kc.position_in_unique_constraint不为null,此条件只能获取外键。

select tc.table_schema, tc.table_name, kc.column_name,tc.constraint_type
from 
    information_schema.table_constraints tc
    JOIN information_schema.key_column_usage kc 
        on kc.table_name = tc.table_name and kc.table_schema = tc.table_schema 
                and kc.constraint_name = tc.constraint_name
where 
--kc.position_in_unique_constraint is not null
order by tc.table_schema,
         tc.table_name,
         kc.position_in_unique_constraint;

我正在尝试做这样的事情(表名略有不同,我可能在不同版本的postgres上)。查询运行,但没有任何返回结果。我是否没有正确的权限-?
szeitlin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.