如何找到所有mysql表之间的所有关系?
Posted
技术标签:
【中文标题】如何找到所有mysql表之间的所有关系?【英文标题】:How to find all the relations between all mysql tables? 【发布时间】:2014-01-18 06:07:19 【问题描述】:如何查找所有 mysql 表之间的所有关系?例如,如果我想知道大约有 100 个表的数据库中表的关系。
有什么办法知道吗?
【问题讨论】:
使用mysql工作台对DB进行逆向工程,给你一张包含所有关系的ER图 除了外键约束外,数据库中没有任何东西可以对关系进行编码。如果程序员没有提供文档,那只是在他们的脑海中,你需要凭经验弄清楚。这就是他们向您支付大笔费用的原因。 可能是 this 的副本。您可以通过这种方式提取外键。 嗨 Satya,您能提供更多详细信息吗?逆向工程数据库是什么? 专业提示,问问知道的前辈就知道了。通常是前人留下的烂摊子。你只需要知道其中的几个。而且公司里可能没有人知道所有的表格。询问文档或图表,他们可能也没有。 【参考方案1】:从编程上讲,更好的方法是从 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表中收集数据,如下所示:
SELECT
`TABLE_SCHEMA`, -- Foreign key schema
`TABLE_NAME`, -- Foreign key table
`COLUMN_NAME`, -- Foreign key column
`REFERENCED_TABLE_SCHEMA`, -- Origin key schema
`REFERENCED_TABLE_NAME`, -- Origin key table
`REFERENCED_COLUMN_NAME` -- Origin key column
FROM
`INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE` -- Will fail if user don't have privilege
WHERE
`TABLE_SCHEMA` = SCHEMA() -- Detect current schema in USE
AND `REFERENCED_TABLE_NAME` IS NOT NULL; -- Only tables with foreign keys
还有更多列信息,如 ORDINAL_POSITION,根据您的目的可能会有用。
更多信息: http://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table.html
【讨论】:
【参考方案2】:试试这个:
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
【讨论】:
【参考方案3】:试试
选择 `TABLE_NAME`, `COLUMN_NAME`, `REFERENCED_TABLE_NAME`, `REFERENCED_COLUMN_NAME` FROM `information_schema`.`KEY_COLUMN_USAGE` WHERE `CONSTRAINT_SCHEMA` = 'YOUR_DATABASE_NAME' AND `REFERENCED_TABLE_SCHEMA` 不为空并且 `REFERENCED_TABLE_NAME` 不为空并且 `REFERENCED_COLUMN_NAME` 不为空
不要忘记将 YOUR_DATABASE_NAME 替换为您的数据库名称!
【讨论】:
【参考方案4】:在 MySQL 中可视化关系的一种快速方法是使用 MySQL Workbench 对数据库进行逆向工程。
这也可以使用逆向工程来完成,这将产生一个类似于以下的实体关系图(尽管一旦生成,您可能必须自己组织它):
【讨论】:
如果您正在处理包含超过 500 个表的遗留代码,则不会! 这太酷了!关系也能自动生成吗?我只有独立的表,不知道这是否可能。【参考方案5】:
SELECT
count(1) totalrelationships ,
c.table_name tablename,
CONCAT(' ',GROUP_CONCAT(c.column_name ORDER BY ordinal_position SEPARATOR ', ')) columnname,
CONCAT(' ',GROUP_CONCAT(c.column_type ORDER BY ordinal_position SEPARATOR ', ')) columntype
FROM
information_schema.columns c RIGHT JOIN
(SELECT column_name , column_type FROM information_schema.columns WHERE
-- column_key in ('PRI','MUL') AND -- uncomment this line if you want to see relations only with indexes
table_schema = DATABASE() AND table_name = 'YourTableName') AS p
USING (column_name,column_type)
WHERE
c.table_schema = DATABASE()
-- AND c.table_name != 'YourTableName'
GROUP BY tablename
-- HAVING (locate(' YourColumnName',columnname) > 0) -- uncomment this line to search for specific column
ORDER BY totalrelationships desc, columnname
;
【讨论】:
这可能是更好的答案。您通常想知道单个表或表的单个列的关系。在将其复制粘贴到您的 sql 终端之前,请先阅读两行之间的内容。【参考方案6】:1) 进入您的数据库:use DATABASE;
2) 显示所有表格:show tables;
3) 查看表格的每一列以收集其作用和构成:describe TABLENAME;
4) 描述很好,因为您可以准确地确定表格列的作用,但如果您想更仔细地查看数据本身:
select * from TABLENAME
如果你有大表,那么每一行通常都有一个id
,在这种情况下,我喜欢这样做只是为了获取几行数据而不会让终端不堪重负:select * from TABLENAME where id<5
- 你可以放任何你喜欢的条件。
这种方法比select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
提供的信息更多,而且每次都能为你提供更多的信息。
编辑
正如 cmets 所建议的,上述 WHERE id < 5
作为条件占位符是一个糟糕的选择。用 ID 号来限制不是一个好主意,尤其是因为 id 通常不可信,不能按顺序排列。改为在查询末尾添加LIMIT 5
。
【讨论】:
在不知道 ID 的情况下使用 WHERE id @Salketer 你是对的。WHERE
子句的选择很糟糕
从 INFORMATION_SCHEMA.TABLE_CONSTRAINTS 中选择 *;作品【参考方案7】:
根据xudre's的回答,你可以执行下面的命令来查看一个schema的所有关系:
SELECT
`TABLE_SCHEMA`, -- Foreign key schema
`TABLE_NAME`, -- Foreign key table
`COLUMN_NAME`, -- Foreign key column
`REFERENCED_TABLE_SCHEMA`, -- Origin key schema
`REFERENCED_TABLE_NAME`, -- Origin key table
`REFERENCED_COLUMN_NAME` -- Origin key column
FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE`
WHERE `TABLE_SCHEMA` = 'YourSchema'
AND `REFERENCED_TABLE_NAME` IS NOT NULL -- Only tables with foreign keys
在大多数情况下,我想要知道指向特定表的所有 FK。在这种情况下,我运行:
SELECT
`TABLE_SCHEMA`, -- Foreign key schema
`TABLE_NAME`, -- Foreign key table
`COLUMN_NAME` -- Foreign key column
FROM `INFORMATION_SCHEMA`.`KEY_COLUMN_USAGE`
WHERE `TABLE_SCHEMA` = 'YourSchema'
AND `REFERENCED_TABLE_NAME` = 'YourTableName'
【讨论】:
【参考方案8】:一种选择是:您可以进行逆向工程以图解方式理解它。
安装 MySQL 后,您将获得 MySQLWorkbench。您需要打开它并选择要逆向工程的数据库。在工具或数据库菜单下的某处单击逆向工程选项。它会要求您选择表格。您要么选择要了解的表,要么选择整个数据库。它将生成一个包含关系的图表。
【讨论】:
【参考方案9】:你可以使用:
SHOW CREATE TABLE table_name;
【讨论】:
这不能回答问题以上是关于如何找到所有mysql表之间的所有关系?的主要内容,如果未能解决你的问题,请参考以下文章