【问题标题】:Display information from an unknown number of tables in a Database显示来自数据库中未知数量表的信息
【发布时间】:2012-12-28 00:20:28
【问题描述】:

我想问一下,是否可以使用单个查询从数据库中的多个表中显示列的名称、类型、大小等?问题是表格永远不会相同,所以我不能硬编码它们。我需要选择整个数据库。例如:

SELECT d1.*, d2.* FROM database1.table1 d1, database2.table1 d2

如您所见,我这里有两个数据库。通过上面的查询,我可以从两个数据库中打印出有关 table1 的信息。但是,我正在寻找一种动态方式来同时打印数据库中的所有表。正如我所说的,数据库和表并不总是相同的。这可能吗?

寻找类似的输出:

`

 |dbname|tname|fname|typename|size|isPk|isFk| 
 |------------------------------------------| 
 | db1  |tbl1 |u_id |VARCHAR | 4  |YES | NO |

`等

提前致谢。

【问题讨论】:

    标签: mysql database jdbc


    【解决方案1】:

    您需要的所有信息都通过MySQL's information_schema views 公开。 几乎所有这些都在“information_schema.columns”表中。

    select table_schema, table_name, column_name, 
           data_type, character_maximum_length, column_key
    from information_schema.columns
    where table_schema in ( 'db-1-name', 'db-2-name')
    order by table_schema, table_name, ordinal_position
    

    “character_maximum_length”列仅适用于可变长度列,但扩展查询以显示整数、大整数、日期等的长度应该相当容易。

    有关外键约束的信息在“information_schema.key_column_usage”中。您只需将其加入“information_schema.columns”即可。

    select c.table_schema, c.table_name, c.column_name, 
           c.data_type, c.character_maximum_length, c.column_key,
           k.referenced_table_name
    from information_schema.columns c
    left join information_schema.key_column_usage k
           on c.table_catalog = k.table_catalog 
          and c.table_schema = k.table_schema
          and c.table_name = k.table_name
          and c.column_name = k.column_name
          and k.referenced_table_name is not null
    where c.table_schema in ( 'db-1-name', 'db-2-name')
    order by c.table_schema, c.table_name, c.ordinal_position
    

    【讨论】:

    • 因为我在这方面的经验很少。您认为使用 ResultSetMetaData 类和 getColumns() 更好吗?我唯一的问题是,我正在寻找服务器上的所有数据库以及这些数据库中的所有表。数据库/表的数量和名称未知。
    • 不,ResultSetMetaData 将为您提供有关结果集的元数据。那不是存储数据库和表名的地方。请查看 DatabaseMetaData interface、getCatalogs()、getSchemas() 和 getTables()。 MySQL 数据库对应于 SQL 模式,而不是 SQL 数据库。 (getCatalogs() 返回 SQL 数据库名称。)我不知道 jdbc 如何为 MySQL 映射目录和模式。但期待惊喜。
    • 谢谢@Catcall,这很有帮助。
    • 在 StackOverflow 上,我们通过点赞有帮助的答案以及接受最有帮助的答案来表达感谢。
    • 我已经投票并接受您的回答。我可以在我的身上看到它!
    【解决方案2】:

    要选择数据库信息,您可以查看

    SELECT * 
    FROM information_schema.columns
    WHERE table_schema in ('database1', 'database2')
    AND table_name in ('table1', 'table2')
    

    【讨论】:

    • 用这个得到奇怪的结果。不是我的数据库包含的内容。使用 ResultSetMetaData 类检索信息。
    • 用我正在寻找的示例输出更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多