簡體   English   中英

列出數據庫表關系及其類型

[英]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種關系:

  • A→B,一對多
  • B→A,多對一
  • B→C,通過b_c多對多
  • C→B,通過b_c多對多

我需要在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

  • 第1行:A→B,一對多
  • 第2行:C→B_C,一對多
  • 第3行:B→B_C,一對多

而且所有這些many to one

  • 第1行:B→A,多對一(與上一相反)
  • 第2行:B_C→C,多對一(上一相反)
  • 第3行:B_C→B,多對一(與上一個相反)

困難在於查找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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM