informationschema—如何获得mysql数据库中表和视图的from子句中使用的所有表和视图的列表?

rekjcdws  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(327)

我试图确定mysql数据库中的所有表和视图都使用了哪些表和视图。例如,我需要看到:

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

我知道我必须对information\u schema执行一个查询,并将其与information\u schema的另一个查询连接起来,但不知道这些查询应该是什么。
感谢您的帮助。

wfsdck30

wfsdck301#

要获取给定数据库视图的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很有帮助地扩展了存储视图定义时使用的表名,使之也包含模式名,然后用反勾号转义lot。通过匹配完整字符串而不仅仅是表名,我们可以消除与部分字符串、列名和别名的匹配。
我假设当你在问题中说“表c使用表d”时,你指的是两者之间的外键关系。你可以从 information_schema.key_column_usage .
例如

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;

相关问题