2012-01-10 66 views
0

我一直在研究不間斷,只能設法找出 - 如何檢查SQL中的一對多關係。我想知道是否有人可以幫助我找出如何檢查SQL代碼中的多對多關係。數據庫中的表格使用正常的格式。用於檢查多對多關係的SQL代碼

我的方案是:

  • 用戶將選擇從數據庫中的三個表。
  • 一旦選定了三個表格,我需要檢查這些表格是否具有多對多關係。
  • 因此,我需要檢查用戶選擇的三個表是否與主鍵關聯,並且交叉表具有指向另外兩個表的兩個引用鍵。

SELECT K_Table = FK.TABLE_NAME, 
     FK_Column = CU.COLUMN_NAME, 
     PK_Table = PK.TABLE_NAME, 
     PK_Column = PT.COLUMN_NAME, 
     Constraint_Name = C.CONSTRAINT_NAME 
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
     ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
     ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
     ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN (SELECT i1.TABLE_NAME, 
        i2.COLUMN_NAME 
      FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
      INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
        ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
      WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT 
     ON PT.TABLE_NAME = PK.TABLE_NAME 
WHERE PK.TABLE_NAME = '" + ActionM2M.Table2 + "' AND 
     FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "' AND 
     exists (SELECT K_Table = FK.TABLE_NAME, 
        FK_Column = CU.COLUMN_NAME, 
        PK_Table = PK.TABLE_NAME, 
        PK_Column = PT.COLUMN_NAME, 
        Constraint_Name = C.CONSTRAINT_NAME 
       FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
       INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
         ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
       INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
         ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
       INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
         ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
       INNER JOIN (SELECT i1.TABLE_NAME, i2.COLUMN_NAME 
          FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
          INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
            ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
          WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY') PT 
         ON PT.TABLE_NAME = PK.TABLE_NAME 
       WHERE PK.TABLE_NAME = '" + ActionM2M.Table1 + "' AND 
        FK.TABLE_NAME = '" + ActionM2M.ITableNames1 + "') 
+2

你能解釋一下你有什麼嗎?你有沒有一張桌子,你正試圖分析它,看它是否處於正確的正常形式?或者你有多個表,你試圖看看是否有一個關聯表(或聯結表)與主鍵包含兩個引用其他表?試圖找到多對多關係的目的是什麼? – 2012-01-10 05:40:39

+0

這個答案應該是有幫助的:http://stackoverflow.com/questions/786918/many-to-many-relationship-use-associative-table-or-delimited-values-in-a-column – 2012-01-10 05:48:50

+0

數據庫處於正常的正常形式。我的情況是:用戶將從數據庫中選擇三個表,一旦選擇了三個表,我需要檢查這些表是否具有多對多關係。所以我需要檢查用戶選擇的這三個表是否與主鍵關聯,並且交叉表具有指向另外兩個表的兩個引用鍵。我希望我已經解釋得夠多了。 – SpaceApple 2012-01-10 05:58:23

回答

0

我不知道這使用戶選擇三個表一樣,是個不錯的UI設計,但我們會把這個放在一邊暫且。

您尚未指定您正在使用哪種語言編寫,或者您正在使用的DBMS。因此,具體細節將會丟失。然而:

  • 有辦法找出每個表的主鍵。這可能是ODBC或JDBC方法,或者您可能會在SQL/Schema表上查詢,或者您可能直接查詢系統目錄。
  • 同樣,有辦法找出每個表的外鍵,包括引用列和引用表。
  • 如果三個表是以隨機順序選擇的,那麼您必須查看每個表的主鍵才能找到一個是複合的,其中包含來自兩個外鍵的列。然後檢查另外兩個表是否是外鍵引用的表。
  • 理想情況下,你應該知道前兩個選定的表格應該是被引用的表格,第三個表格應該是「交叉點」或「聯結」或「關聯」表格,所以你不需要必須找出哪個表具有「連接」角色;您只需檢查指定爲具有「聯結」角色的表是否確實符合要求。

我認爲您可能會更好地向用戶展示鏈接信息,而不是強迫他們選擇表 - 但這取決於您的「用戶」本身是DBA還是來自HR或者財務,並且對於DBMS和表格毫無頭緒。

+0

用戶是開發人員將使用此應用程序,使表維護更容易。基本上它是一個SQL關係數據庫:這是我在同一時間的代碼,但我知道這不是正確的解決方案,因爲它只能一次檢查兩個表,而不是三個。 – SpaceApple 2012-01-10 07:53:05