簡體   English   中英

MySQL:如何以編程方式確定外鍵關系?

[英]MySQL: How to determine foreign key relationships programmatically?

類似於這個問題,但對於 MySQL ....

如何以編程方式確定 MySQL 中的外鍵引用(假設 InnoDB)? 我幾乎可以得到它們:

SHOW TABLE STATUS WHERE Name = 'MyTableName';

...但唉,似乎包含其中一些信息的評論欄被截斷了,所以我不能依賴它。 一定有別的辦法……

我對 C API 調用、SQL 語句或任何東西都感到滿意——我只需要一些始終有效的東西。

注意:我還考慮過解析“SHOW CREATE TABLE MyTableName”語句的結果,但我真的希望有更簡單的東西。

您可以查詢兩個表來獲取此信息: INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_SCHEMA.KEY_COLUMN_USAGE

這是上面鏈接的后一頁的評論中的查詢,它演示了如何獲取您要查找的信息。

SELECT CONCAT( table_name, '.', column_name, ' -> ', 
  referenced_table_name, '.', referenced_column_name ) AS list_of_fks 
FROM INFORMATION_SCHEMA.key_column_usage 
WHERE referenced_table_schema = 'test' 
  AND referenced_table_name IS NOT NULL 
ORDER BY table_name, column_name;

使用您的架構名稱而不是上面的“ test ”。

在這里,您對@bill 解決方案有一些改進:

SELECT CONSTRAINT_SCHEMA AS db,
       CONCAT (
           TABLE_NAME,
           '.',
           COLUMN_NAME,
           ' -> ',
           REFERENCED_TABLE_NAME,
           '.',
           REFERENCED_COLUMN_NAME
       ) AS relationship 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'your_table_name'
ORDER BY CONSTRAINT_SCHEMA,
         TABLE_NAME,
         COLUMN_NAME;

在這種情況下,我通過與“your_table_name”字段的關系進行過濾,並查看關系來自哪個數據庫。

試試INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

根據 Bill Karwin 的回答,我使用這個解決方案來獲取我需要的所有信息,包括 on_delete 和 on_update 規則:

SELECT kcu.referenced_table_schema, kcu.constraint_name, kcu.table_name, kcu.column_name, kcu.referenced_table_name, kcu.referenced_column_name, 
       rc.update_rule, rc.delete_rule 
FROM INFORMATION_SCHEMA.key_column_usage kcu
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc on kcu.constraint_name = rc.constraint_name
WHERE kcu.referenced_table_schema = 'db_name' 
AND kcu.referenced_table_name IS NOT NULL 
ORDER BY kcu.table_name, kcu.column_name
SELECT TABLE_NAME,
       COLUMN_NAME,
       CONSTRAINT_NAME,
       REFERENCED_TABLE_NAME,
       REFERENCED_COLUMN_NAME 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE REFERENCED_TABLE_NAME = 'table_name'
      AND TABLE_SCHEMA = 'table_schema';

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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