如何找到所有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表之间的所有关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何从定义了 n 个点之间所有关系的矩阵中找到组数?

Oracle:如何循环并查找表之间的依赖/依赖关系,以便为每个表执行插入/更新操作?

当关联表是一个对所有一对多关系时,如何实现一对多映射?

Mysql 表与表之间的关系

在mysql中如何查看各表之间的关系图

没有FK时如何找到维度表和事实表之间的关系?