[英]List database table relationships and their type
我想知道是否有一種方法可以基於外鍵關系以編程方式列出數據庫中的表關系及其類型?
以這些表為例:
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種關系:
我需要在PHP中執行此操作,但是任何一種可以理解的算法/偽代碼也有望對您有所幫助。 👍🏼
我認為one to many
很容易,您已經知道了。 遍歷此表
row table column referenced_table referenced_column
1 b a_id a id
2 b_c c_id c id
3 b_c b_id b id
那里有one to many
而且所有這些many to one
的
困難在於查找many-to-many
,從理論上講,我認為您應該使用圖形並導航以找到所有many-to-many
關系,但是我可以想到您可以使用所擁有的表的一個技巧:像這樣按列分組
SELECT
table as through,
GROUP_CONCAT(referenced_table SEPARATOR ',') as tables
FROM (
SELECT
table_name 'table',
referenced_table_name 'referenced_table',
FROM
information_schema.key_column_usage
WHERE
referenced_table_name IS NOT NULL
AND table_schema = 'test';
) as yourQuery
GROUP BY table
HAVING count(referenced_table) > 1;
你應該以這樣的結尾
row through tables
1 b_c c,b
這將在第一欄中為您提供直通表的名稱,並在“表”行中提供多個多對多表的名稱(可以是2個或更多)
USE information_schema;
SELECT * FROM `REFERENTIAL_CONSTRAINTS`;
SELECT * FROM `TABLE_CONSTRAINTS` where constraint_type LIKE 'F%';
SELECT * FROM `INNODB_SYS_FOREIGN_COLS`;
SELECT * FROM `INNODB_SYS_FOREIGN`;
這就是我在5.6和MariaDB 10.2.2上發現的。
對於多對多表,您最好同時進行兩個方向的操作。 溫馨提示 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.