2014-08-28 110 views
2

外鍵我有兩個問題,我需要幫助:查詢找到數據庫架構

  1. 我想有一個顯示在一個模式中的表外鍵關係的查詢。我的整個目標是找出模式中的表是否聲明瞭外鍵,以在模式中的表之間建立關係。例如,如果開發人員聲明,使用「show crate table」將在表上顯示外鍵。我試圖使用「顯示錶​​狀態」,並期望在評論欄中看到外鍵關係,但事實並非如此。無論如何,是否有一個查詢可以用來檢查模式中的表之間的外鍵關係?

  2. 什麼是我可以用來執行數據庫分析的好查詢?我得到了一個我需要分析的舊數據庫,所以我們可以改進它的設計和結構。

謝謝。

+0

查看information_schema數據庫,您會在該表中找到一些有用的信息。包括鑰匙。 – 2014-08-28 11:43:21

+0

如果這用於分析您繼承的數據庫,爲什麼不使用SQLYog或類似的可視化工具?把幾周的工作花費幾分鐘。 – 2014-08-28 11:43:37

回答

3

您可以使用INFORMATION_SCHEMA此:

SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE 
    CONSTRAINT_TYPE='FOREIGN KEY' 

可能類型的約束可能是:

  • PRIMARY KEY主鍵
  • FOREIGN KEY外鍵
  • UNIQUE唯一約束

所以你有興趣FOREIGN KEY類型。這將向您顯示哪個列上有哪個表約束,但不會顯示目標約束列和表。爲了找到它們,你需要使用另一個表,INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS其中有這樣的信息,所以,基本上,重建表之間的關係,你需要:

SELECT 
    t.TABLE_SCHEMA, 
    t.TABLE_NAME, 
    r.REFERENCED_TABLE_NAME 
FROM 
    INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS t 
    JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS AS r 
    ON t.CONSTRAINT_NAME=r.CONSTRAINT_NAME 
WHERE 
    t.CONSTRAINT_TYPE='FOREIGN KEY' 

但是,這再次丟失列(因爲它不屬於這些表),並將通過表間的FK顯示只有關係。爲了重建完整的關係(即涉及列),你需要參考KEY_COLUMN_USAGE表:

SELECT 
    TABLE_SCHEMA, 
    TABLE_NAME, 
    COLUMN_NAME, 
    REFERENCED_TABLE_SCHEMA, 
    REFERENCED_TABLE_NAME, 
    REFERENCED_COLUMN_NAME 
FROM 
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE 
    REFERENCED_TABLE_SCHEMA IS NOT NULL 

此查詢將顯示所有關係,其中引用的實體不爲空,並且,因爲它只在FK情況下是適用的 - 這是尋找FK關係問題的答案。這是非常普遍的,但我提供了上面的方法,因爲它可能對獲取有關PK或唯一約束的信息也很有用。

+0

嗨,阿爾瑪。這正是我所期待的。感謝大家提供建議。還有一個問題,如果一個數據庫沒有任何外鍵,它可以被認爲是「關係型」的?如果有一個數據庫沒有任何參照完整性,有哪些優點? – 2014-08-28 14:29:54

+0

我接管的模式有大約1000個表,並且使用上面提供的查詢,模式不使用任何外鍵。這是一個很好的設計,不使用外鍵或參照完整性?這種類型的設計在什麼情況下會是想法? – 2014-08-28 15:32:39

+0

那麼,我建議你在單獨的問題中提出問題 - 因爲即使它與收集這種信息的方法有關,它也是基本的設計問題 – 2014-08-28 15:33:36