2008-11-07 75 views
14

this question類似,但對於MySQL ...MySQL:如何以編程方式確定外鍵關係?

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

SHOW TABLE STATUS WHERE Name = 'MyTableName'; 

...但很可惜,這似乎含有一些這種信息的註釋列被截斷,所以我不能依賴它。必須有一些其他的方式...我會很高興與C API調用,SQL語句,任何東西 - 我只需要一直工作的東西。

注:我也考慮解析「SHOW CREATE TABLE MyTableName」語句的結果,但我真的希望有更簡單的東西。

回答

29

有兩個表可以查詢得到這個信息: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'。

+0

謝謝,比爾。這就完美了! – 2008-11-08 02:23:08

+0

查詢速度很慢....`/ * 0行受到影響,找到22行。 1個查詢的持續時間:2,996秒。 * /` – 2012-08-21 09:26:59

2

嘗試INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS

+0

我似乎沒有那張表,但我確實有INFORMATION_SCHEMA.TABLE_CONSTRAINTS,它擁有大部分(但不是全部)我需要的信息。不管怎麼說,多謝拉! – 2008-11-08 02:29:05

7

在這裏,你有過@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」領域的關係過濾,看到從該數據庫中的關係來。

-1
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'; 
相關問題