【问题标题】:select all attributes of columns, constraints, tables of a database选择数据库的列、约束、表的所有属性
【发布时间】:2012-09-09 12:54:46
【问题描述】:

我正在从 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';

提前感谢您的帮助:)

【问题讨论】:

    标签: mysql sql select join information-schema


    【解决方案1】:

    您的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)。

    【讨论】:

    • @Sami: Re: #1: 这个查询应该保证columns.table_schema'test'。你看到了什么不同的东西吗?回复:#2:您可以使用GROUP BY 解决这个问题。我将编辑我的答案。
    • 感谢您的精彩回复。这就是我所需要的,但令人惊讶的是,没有 k.table_schema=t.table_schema 就很好,只是 c.table_schema=t.table_schema 是强制性的。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多