关于数据库:如何查找所有mysql表之间的所有关系?

How to find all the relations between all mysql tables?

如何找到所有MySQL表之间的所有关系? 例如,如果我想知道具有大约100个表的数据库中的表的关系。

反正知道这个吗?


从编程方面来说,更好的方法是从INFORMATION_SCHEMA.KEY_COLUMN_USAGE表中收集数据,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
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


试试这个:

1
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;


尝试

SELECT
`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` IS NOT NULL AND
`REFERENCED_TABLE_NAME` IS NOT NULL AND
`REFERENCED_COLUMN_NAME` IS NOT NULL

不要忘记用您的数据库名称替换YOUR_DATABASE_NAME!


在MySQL中可视化关系的快速方法是使用MySQL Workbench对数据库进行逆向工程。

这也可以使用逆向工程来完成,这将导致实体关系图非常类似于以下(尽管您可能必须自己组织它,一旦生成):

ERD


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
;


您可以使用:

1
SHOW CREATE TABLE table_name;


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;,而且每次都会为您提供更多信息。

编辑

正如评论所暗示的那样,上述WHERE id < 5作为条件占位符是一个糟糕的选择。按ID号限制并不是一个好主意,特别是因为id通常不值得信赖。改为在查询末尾添加LIMIT 5


一种选择是:您可以进行逆向工程以图解方式理解它。

安装MySQL时,您将获得MySQLWorkbench。您需要打开它并选择要反向工程的数据库。单击"工具"或"数据库"菜单下的某处"反向工程"选项。它会要求您选择表格。您可以选择要理解的表格,也可以选择整个数据库。它将生成一个包含关系的图表。