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子句确保您只查看 schema 中的表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 对“隐藏”的 GROUP BY 列的支持)。

于 2012-09-09T13:05:38.917 回答