1

MySqlのinformation_schemaからテーブル、列、制約のすべての属性をフェッチしています

select t.*,c.*,k.*
from information_schema.tables t
inner join information_schema.COLUMNS c on c.table_name=t.table_name
left outer join information_schema.key_column_usage k on 
c.column_name=k.column_name
and k.table_name=t.table_name and k.referenced_column_name is not NULL
where t.table_schema='test' order by t.table_name;
  1. このクエリの問題は、同じ名前の他のデータベースにテーブルがある場合、この特定のデータベースのwhere条件が明確であっても、そのテーブルの列も取得することです。

  2. 左外部結合を使用しない場合、すべての列が外部キーではないため、多くの列が欠落していることがわかります

このクエリを少しガイダンスとともに改善する必要がありますが、まったく異なるソリューションも受け入れられます。

改善されたクエリの結果の行数は、

select count(*) from information_schema.columns c where c.table_schema='test';

事前に助けてくれてありがとう:)

4

1 に答える 1

3

where句は、スキーマ内のテーブルのみを表示していることを保証しますが、 /句には、列がテーブルと同じスキーマからのものであることを保証するものはありませtestん。(によって記述された列が、によって記述されたものと同じ名前のテーブルからのものであることを確認するだけです。)そして、同様に。だから、あなたは書くことができます:joinonon c.table_name=t.table_namectkey_column_usage

select t.*,c.*,k.*
from information_schema.tables t
inner join information_schema.COLUMNS c
      on c.table_schema=t.table_schema
      and c.table_name=t.table_name
left outer join information_schema.key_column_usage k
      on k.table_schema=t.table_schema
      and k.table_name=t.table_name
      and k.column_name=c.column_name
      and k.referenced_column_name is not NULL
where t.table_schema='test'
order by t.table_name;

count(*)とはいえ、原則として1つの列が複数の外部キーに属する可能性があるため、これでもレポートよりも多くの行が返される可能性があります。列ごとに1つの行のみ、つまり1つの列に対して1つの外部キーのみを取得するようにするには、次のGROUP BY句を追加できます。

where t.table_schema='test'
group by t.table_schema, t.table_name, c.column_name
order by t.table_name;

MySQLの「隠された」GROUPBY列のサポートを利用しました)。

于 2012-09-09T13:05:38.917 に答える