1

このフィールド名、テーブル名(このフィールドが存在する場所)、およびスキーマ名(ここでテーブルとそれによってフィールドが存在します)

例えば:

Schema1.TableA
  Id (Integer, PK)  
  Name varchar


Schema2.TableB
  Id (integer, PK)  
  A_Id (integer, FK referencing TableA.Id)  
  Name varchar  

A_IdTableBおよびSchema2を関数に渡して、Schema1.TableA結果を取得する必要があります。

私はPostgres8.3を使用しています。

4

1 に答える 1

1

これを別のRDBMSに移植する必要がない場合は、標準の情報スキーマの代わりにカタログテーブルを使用する方がはるかに高速で簡単です。pg_catalog

SELECT c.confrelid::regclass::text AS referenced_table
     , c.conname AS fk_name
     , pg_get_constraintdef(c.oid) AS fk_definition
FROM   pg_attribute a 
JOIN   pg_constraint c ON (c.conrelid, c.conkey[1]) = (a.attrelid, a.attnum)
WHERE  a.attrelid = '"Schema2"."TableB"'::regclass   -- table name
AND    a.attname  = 'A_Id'                           -- column name  
AND    c.contype  = 'f'
ORDER  BY conrelid::regclass::text, contype DESC;

戻り値:

 referenced_table | fk_name  |  fk_definition
------------------+-------------------------+----------------------------------------------
 Schema1.TableA   | b1_fkey  | FOREIGN KEY ("B_id") REFERENCES "Schema1"."TableA"("A_id")

ノート

  • 追加の2つの列は、方向付け専用です。あなたのQによると、あなたは最初の列だけが必要です。

  • これにより、指定された列名に関連するすべての外部キーによって参照されるすべてのテーブルが返されます。これには、複数の列に対するFK制約が含まれます

  • 名前は、現在のによって設定された可視性に応じて、自動的にスキーマ修飾されるかどうかになりsearch_pathます。名前も必要に応じて自動的にエスケープされます(不正または大文字、予約語など)。

マニュアルの詳細pg_constraintを確認してください。また、オブジェクト識別子の種類pg_attributeについても詳しく説明します。

関連している:

于 2013-03-25T21:22:47.580 に答える