我从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;
此查询的问题是,如果我在任何其他具有相同名称的数据库中有一个表,我也会得到该表的列,即使我有一个明确的特定数据库的where条件
如果我不使用左外连接,我会发现很多列丢失,因为所有列都不是外键
我需要改进这个查询以及一些指导,但是一个完全不同的解决方案也是可以接受的。
改进查询的结果行数必须等于
select count(*) from information_schema.columns c where c.table_schema='test';
感谢您提前提供任何帮助:)
答案 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;