如何找到所有mysql表之间的所有关系?

use*_*861 24 mysql database relationship relation

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

反正知道这个吗?

xud*_*dre 39

从编程方面来说,更好的方法是从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
Run Code Online (Sandbox Code Playgroud)

有更多列信息,如ORDINAL_POSITION,根据您的目的可能有用.

更多信息: http ://dev.mysql.com/doc/refman/5.1/en/key-column-usage-table.html


BaB*_*L86 15

试试这个:

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
Run Code Online (Sandbox Code Playgroud)


Mos*_*aei 8

尝试

选择
`TABLE_NAME`,
`COLUMN_NAME`,
`REFERENCED_TABLE_NAME`,
`REFERENCED_COLUMN_NAME`
来自`information_schema`
.KEY_COLUMN_USAGE` WHERE`CONSTRAINT_SCHEMA` ='YOUR_DATABASE_NAME'和
'REFERENCED_TABLE_SCHEMA`不是空的,
`REFERENCED_TABLE_NAME`不是空的,
而是`REFERENCED_COLUMN_NAME`不是空的

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


小智 6

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

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

ERD

  • 如果您正在处理超过500个表的遗留代码,那就不是了! (3认同)

Ric*_*iro 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
;
Run Code Online (Sandbox Code Playgroud)


Luc*_*tto 5

根据xudre的回答,您可以执行以下命令来查看模式的所有关系:

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
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,我想要的是知道指向特定表的所有 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'
Run Code Online (Sandbox Code Playgroud)