如何查找所有MySQL表之间的所有关系?例如,如果我想知道数据库中有大约100个表的表的关系。
反正知道这个吗?
答案 0 :(得分:32)
从编程方面来说,更好的方法是从 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
答案 1 :(得分:14)
试试这个:
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
答案 2 :(得分:8)
尝试
选择
`TABLE_NAME`,
`COLUMN_NAME`,
`REFERENCED_TABLE_NAME`,
`REFERENCED_COLUMN_NAME`
来自`information_schema` .KEY_COLUMN_USAGE`
在哪里`CONSTRAINT_SCHEMA` ='YOUR_DATABASE_NAME'和 `REFERENCED_TABLE_SCHEMA`不是空和
`REFERENCED_TABLE_NAME`不是空和 `REFERENCED_COLUMN_NAME`不是空白
不要忘记将YOUR_DATABASE_NAME替换为您的数据库名称!
答案 3 :(得分:5)
答案 4 :(得分:2)
你可以使用:
SHOW CREATE TABLE table_name;
答案 5 :(得分:2)
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
;
答案 6 :(得分:1)
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
。
答案 7 :(得分:1)
基于xudre's答案,您可以执行以下命令查看架构的所有关系:
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 :(得分:0)
一个选项是:您可以进行逆向工程以图解方式理解它。
安装MySQL时,您将获得MySQLWorkbench。您需要打开它并选择要反向工程的数据库。单击“工具”或“数据库”菜单下的某处“反向工程”选项。它会要求您选择表格。您可以选择要理解的表格,也可以选择整个数据库。它将生成一个关系图。
答案 9 :(得分:-2)