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

ibrsph3r  于 2022-10-03  发布在  Mysql
关注(0)|答案(9)|浏览(163)

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

有什么办法知道这件事吗?

toe95027

toe950271#

从编程Angular 讲,更好的方法是从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

还有更多像ORDNAL_POSITION这样的列信息可能会对您的用途有所帮助。

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

hwazgwia

hwazgwia2#

试试这个:

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
axkjgtzd

axkjgtzd3#

尝试

TABLE_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替换为您的数据库名称!

6bc51xsx

6bc51xsx4#

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

这也可以使用反向工程来完成,这将产生一个很像下面这样的实体-关系图(尽管一旦生成,您可能需要自己组织它):

31moq8wy

31moq8wy5#

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
;
mftmpeh8

mftmpeh86#

1)进入您的数据库:
use DATABASE;

2)显示所有表格:
show tables;

3)查看表格的每一列,收集它的用途和构成:
describe TABLENAME;

4)DESCRIBE很好,因为您可以准确地找出表列的作用,但如果您想更仔细地查看数据本身:select * from TABLENAME
如果您有很大的表,那么每一行通常都有一个id,在这种情况下,我喜欢这样做是为了只获取几行数据,而不会使终端不堪重负:
select * from TABLENAME where id<5-您可以在此处添加任何您喜欢的条件。

这种方法为您提供了比select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS;更多的信息,而且每次它还为您提供更小的信息。

编辑

正如评论所暗示的,作为条件占位符,上面的WHERE id < 5不是一个好的选择。按ID号进行限制不是一个好主意,尤其是考虑到ID通常不值得信任而不是连续的。改为在查询末尾添加LIMIT 5

hkmswyz6

hkmswyz67#

根据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'
f0brbegy

f0brbegy8#

一种选择是:你可以做逆向工程,以图解的方式理解它。

当您安装MySQL时,您将获得MySQLWorkbench。您需要打开它并选择要进行反向工程的数据库。在工具或数据库菜单下的某个位置单击反向工程选项。它会让你选择table。您可以选择想要了解的表,也可以选择整个数据库。它将生成一个带有关系的图表。

vcirk6k6

vcirk6k69#

您可以使用:

SHOW CREATE TABLE table_name;

相关问题