【发布时间】:2017-06-30 22:42:39
【问题描述】:
我想知道是否有一种方法可以根据外键关系以编程方式列出数据库中的表关系及其类型?
以这些表格为例:
CREATE TABLE `a` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `b` (
`id` int NOT NULL,
`a_id` int NOT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk.b.a.b` FOREIGN KEY (`a_id`) REFERENCES `a` (`id`)
) ENGINE=InnoDB;
CREATE TABLE `c` (
`id` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
CREATE TABLE `b_c` (
`b_id` int NOT NULL,
`c_id` int NOT NULL,
PRIMARY KEY (`b_id`,`c_id`),
CONSTRAINT `fk.b_c.b.c` FOREIGN KEY (`c_id`) REFERENCES `c` (`id`),
CONSTRAINT `fk.b_c.c.b` FOREIGN KEY (`b_id`) REFERENCES `b` (`id`)
) ENGINE=InnoDB;
我们可以通过这个查询得到外键关系:
SELECT
table_name 'table',
column_name 'column',
referenced_table_name 'referenced_table',
referenced_column_name 'referenced_column'
FROM
information_schema.key_column_usage
WHERE
referenced_table_name IS NOT NULL
AND table_schema = 'test';
table column referenced_table referenced_column
b a_id a id
b_c c_id c id
b_c b_id b id
现在...我认为上面的关系信息应该足以推断存在哪些关系及其类型,但我无法将其翻译成算法...回答我原来的问题:我知道有办法,但一直找不到。 ????
所以,我希望比我这里更聪明的人知道如何已经做到这一点,或者准备好脑筋急转弯(在我的情况下是脑杀手)来解决? ????
基本上,在这种情况下,“答案”应该是有 4 个关系:
- A → B,一对多
- B → A,多对一
- B → C,多对多,通过 b_c
- C → B,多对多,通过 b_c
我需要在 PHP 中执行此操作,但任何可理解的算法/伪代码也有望提供很大帮助。 ??????????
【问题讨论】:
-
我不认为这是重复的
-
@Marc-AntoineParent 否,这是我发现的 许多 其他帖子之一(在一个或另一个变体中)我在帖子中的 SQL。我的问题是关于“下一步”,即如何将来自该SQL的响应“解析”到我最后列出的关系类型信息中。
-
@Svish 好的,很抱歉 :) 您需要以图形方式表示关系还是只列出它们?
-
@Marc-AntoineParent 我只需要将它们放在一个列表中,以便稍后在我的代码中使用这些信息。例如,给定
b,我需要知道它有一个与a的多对一以及与c到b_c的多对多。
标签: php mysql sql mariadb relationships