Мне интересно, есть ли способ программно перечислить отношения в базе данных в базе данных и их тип, основанный на отношениях внешнего ключа?Перечислите отношения базы данных базы данных и их тип
Возьмем, к примеру эти таблицы:
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
сейчас ... Я думаю, взаимосвязи информации выше должно быть достаточно, чтобы вывести, что rel существует и их типы, но я не могу перевести его в алгоритм ... Чтобы ответить на мой первоначальный вопрос: я знаю, что есть способ, но не смог его найти.
Итак, я надеюсь, что кто-то более яркий, чем я здесь, либо знаю, как это можно сделать уже, либо для мозгового дразнилки (мозгового убийцы, в моем случае), чтобы решить?
В принципе, "ответ" должен, в этом случае в том, что есть 4 отношения:
- → B, один-ко-многим
- B → A, многоэлектронные к-одному
- B → C, многие-ко-многим, через b_c
- C → B, многие-ко-многим, через b_c
Мне нужно сделать это на PHP, но любой вид понятного алгоритма/псевдокода, надеюсь, тоже поможет.
Возможный дубликат: http://stackoverflow.com/questions/20855065/how-to-find-all-the-relations-between-all-mysql-tables –
Я не думаю, что это дубликат – jperelli
@ Marc-AntoineParent ** Нет **, это одно из * многих * других сообщений, которые я нашел, где ответ (в том или ином варианте) SQL, который у меня есть в моем сообщении. Мой вопрос касается «следующего шага», то есть как «разобрать» ответ * из * этого SQL в информацию типа отношения, которую я перечисляю в конце. – Svish