すべてのテーブルの主キーを一覧表示する-Postgresql


14

それを行うクエリはありますか?

1つのテーブルに対してこれを行うことができるクエリをいくつか見つけましたが、次のように変更することができませんでした。

tablename | column | type

1
これを求めている場合、PK内の列の順序位置を知りたいです(一部のPKには複数の列があり、順序が重要な場合があります)。
ypercubeᵀᴹ

回答:


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łニクラスが

@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_constraintFOREIGNキーの位置を示します。主キーの場合は常にnullです。正しい列はordinal_positionです。PG 9.4でテスト済み。
-greatvovan

1
@a_horse_with_no_name匿名ユーザーによって提案された編集を承認しました。編集が成功するかどうか不明で、他の人は拒否しました。いずれにしても、greatvovanによる上記の提案とコメントを確認してください。私はそれらが正しいと思うordinal_positionと使用する必要があります。position_in_unique_constraintのみFKSの使用でnullではありません。
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

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ᵀᴹが言うことです。この回答を削除してください。ただし、落胆しないでください-ツアーに参加して、ヘルプセンターにアクセスし、「ヘルプを提供してください」ブログを読んでください。尋ねられなかった何かに答えることに関しては、私たちはすべてそれを何度もやりました:-)。フォーラムへようこそ!
ベレース

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.