如何获取MYSQL数据库中表和视图的from子句中使用的所有表和视图的列表?

时间:2018-05-29 16:25:25

标签: mysql information-schema

我正在尝试确定哪些表和视图用于MYSQL数据库中的所有表和视图。例如,我需要看到:

table A uses view B
table A also uses table C   
table C uses table D
table C also uses view X

我知道我必须对information_schema进行查询并将其加入到另一个information_schema查询中,但不知道这些查询应该是什么。

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

要获取给定数据库的FROM子句中使用的表和视图的列表,您可以使用:

SELECT CONCAT('`', v.table_schema,'`.`', v.table_name,'`') AS 'view', 
GROUP_CONCAT(CONCAT(' `', t.table_schema,'`.`', t.table_name, '`')) AS 'tables' 
FROM information_schema.tables t
JOIN information_schema.views v
  ON (v.view_definition REGEXP CONCAT('`', t.table_schema, '`.`' , t.table_name, '`') = 1)
WHERE v.table_schema = 'sakila'
GROUP BY 1;

MySQL相当有用地扩展了存储视图定义时使用的表名,以包含模式名称,然后使用反引号转义批次。通过匹配这个完整的字符串而不仅仅是表名,我们可以消除匹配部分字符串,列名和碰巧匹配的别名。

我假设当你说"表C使用表D"在你的问题中,你指的是两者之间的外键关系。您可以从information_schema.key_column_usage获取此数据。

e.g。

SELECT CONCAT('`', table_schema, '`.`', table_name, '`') AS 'table', 
GROUP_CONCAT(DISTINCT CONCAT(' `', referenced_table_schema, '`.`', referenced_table_name, '`')) AS 'referenced table(s)' 
FROM information_schema.key_column_usage 
WHERE 1 = 1
AND table_schema = 'sakila'
AND referenced_column_name IS NOT NULL
GROUP BY 1;