选择数据库的列,约束,表的所有属性

时间:2012-09-09 12:54:46

标签: mysql sql select join information-schema

我从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. 如果我不使用左外连接,我会发现很多列丢失,因为所有列都不是外键

  3. 我需要改进这个查询以及一些指导,但是一个完全不同的解决方案也是可以接受的。

    改进查询的结果行数必须等于

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

    感谢您提前提供任何帮助:)

1 个答案:

答案 0 :(得分:3)

您的where子句确保您只查看架构test中的表,但join / on子句中的任何内容都不会确保您的列来自与表格相同的架构。 (on c.table_name=t.table_name仅确保c描述的列来自与t描述的名称相同的表格。)同样适用于key_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(*)报告更多的行,因为原则上单个列可以属于多个外键。为了确保每列只获得一行,这意味着只有一列的外键,您可以添加GROUP BY子句:

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

(我利用了MySQL's support for "hidden" GROUP BY columns)。