2012-01-16 8 views
3

これは少し現実的ではないかもしれませんが、最近は遠隔でシステムのデータベース構造を研究しなければならず、与えられたテーブルにリンクされているすべてのカラムを見つけたいと思ったとき(オリジナルの開発者は明示的な関係を作成せず、その代わりにカラム名にエンコードされた関係を持っていました!与えられたパターンに一致するカラム名を持つテーブルを見つける

たとえば、列parent.parentを参照するすべての列が、2つのフィールド間の関係を文書化する方法としてtable.somefield_parentという形式を持つと仮定した場合、標準SQLコマンド/組み込み関数?

MySQLまたはPostgreSQL用のソリューションは歓迎します。

注:

  • はなく、メタデータでは、データのパターンを捜しているわけではありません。
  • DB構造をダンプして結果を検索することができますが、これらの関係を見つけるためにdb-shellから抜け出したくありません(psqlと言います。 exit)

答えて

1

として有用であるinformation_schema.tablesが含まれます。

情報を表示する標準のSQL方法を提供するビューで構成されるinformation_schemaを照会することもできます。システムカタログの照会は、通常ははるかに高速です。

SELECT n.nspname AS schema_name 
    , c.relname AS table_name 
    , a.attname AS column_name 
FROM pg_catalog.pg_attribute a 
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid 
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
WHERE a.attname ~~ E'%\\_parent' 
AND NOT a.attisdropped 
AND c.relkind = 'r' 
AND nspname !~~ E'pg\\_%'; 

記述に従ってすべて関連の列を見つけるには:

SELECT n.nspname AS parrent_schema 
    , c.relname AS parrent_table 
    , a.attname AS parrent_column 
    , n1.nspname AS child_schema 
    , c1.relname AS child_table 
    , a1.attname AS child_column 
FROM pg_catalog.pg_attribute a 
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid 
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
JOIN pg_catalog.pg_attribute a1 ON a.attname = substring(a1.attname, '_(.*?)$') 
JOIN pg_catalog.pg_class c1 ON c1.oid = a1.attrelid 
JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace 
WHERE c.relkind = 'r' 
AND c1.relkind = 'r' 
AND n.nspname !~~ E'pg\\_%' 
AND n1.nspname !~~ E'pg\\_%' 
AND NOT a.attisdropped 
AND NOT a1.attisdropped 
-- AND n.nspname = 'public' -- to narrow it down to a specific schema 
-- AND n1.nspname = 'public' -- to narrow it down to a specific schema 
ORDER BY 1,2,3,4,5,6 

これはparrentの列が持っていないことを前提として一つの特定のparentの列の子どもたちを見つけるのは

名前の_

a.attname = substring(a1.attname, '_(.*?)$') 
0

MySQLを使用している場合は、データベースinformation_schemaを使用できます。このデータベースには、そのサーバー上のデータベースのすべてのメタデータが含まれています。私が知る限り、すべてのデータベースユーザーはそのデータベースにアクセスする必要があります。

7

information_schema.columnsビューを照会してみてください。それはMySQLで動作しますが、私はPostgresでそれを試していません。 information_schemaスキーマはANSI SQL標準の一部であるため、Postgresにはおそらくそれがあるでしょう。 information_schema

他のビューを使用すると、システム・カタログ表を照会することができますではPostgreSQLの

+0

'同様のPostgreSQLで動作information_schema.columns':
重要な要素は、結合条件です。 –

+0

情報ありがとうございます。知っておいてよかった。 –

+3

'%_parent 'やtable_catalog =' sat ';'のようなcolumn_nameのinformation_schema.columnsから 'select table_name、column_name'のようなことをして、私の問題を解決しました。ありがとう – nemesisfixx

関連する問題