2

これに代わるより高速な方法はありますか:

サーバーで約 1 分かかります。

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' AND tc.table_name='mytable';

たぶん pg_class メタデータを使用していますか?、ありがとう。

4

3 に答える 3

2

問題があります: 外部キーは 2 つ以上の列にある可能性があります (FOREIGN KEY (b, c) REFERENCES other_table (c1, c2))。最初に、そのようなキーをどうするかを指定する必要があります。

すべての外部キーを取得するために使用するクエリを次に示しますが、単純な (1 列の) 外部キーに対してのみ正しく機能します。

SELECT pgcon.conname as constraint_name, 
       cast(pgcon.conrelid as regclass) as table_name,
       cast(pgcon.confrelid as regclass) as foreign_table_name,
       pga1.attname as column_name,
       pga2.attname as foreign_column_name
FROM pg_constraint pgcon
JOIN pg_attribute pga1 on (pgcon.conrelid = pga1.attrelid
                       and pga1.attnum = any(pgcon.conkey))
JOIN pg_attribute pga2 on (pgcon.confrelid = pga2.attrelid
                       and pga2.attnum = any(pgcon.confkey))
WHERE pgcon.conrelid = cast('table_name_here' as regclass)
  AND pgcon.contype = 'f'
于 2012-11-15T16:58:23.617 に答える
1

同じ結果を得るには:

SELECT conname
      ,c.conrelid::regclass AS table_name
      ,(SELECT string_agg(a.attname, ', ') FROM pg_attribute a
        WHERE  a.attrelid = c.conrelid
        AND    a.attnum = ANY(c.conkey)) AS columns
      ,c.confrelid::regclass
      ,(SELECT string_agg(a.attname, ', ') FROM pg_attribute a
        WHERE  a.attrelid = c.confrelid
        AND    a.attnum = ANY(c.confkey)) AS foreign_columns
FROM   pg_constraint c
WHERE  c.conrelid = 'mytable'::regclass
AND    c.contype = 'f'
ORDER  BY c.conname;

このテーブルに由来する外部キーをカバーします。

于 2012-11-15T23:09:41.077 に答える
0

次のクエリを使用できます。

SELECT conname, pg_get_constraintdef(oid)
  FROM pg_constraint
 WHERE confrelid='mytable'::regclass;

confrelidは外部キーに対してのみ設定され、参照されるテーブルが含まれています

このビットは、この depesz の投稿に触発されています。

于 2012-11-15T20:42:28.170 に答える