2011-04-13 21 views
2

我正在處理通用應用程序,它使用一組預先選擇的數據庫表(及其關係)來生成用於管理這些表中數據的用戶界面。 Basicaly,我只是從信息模式中查找東西,獲取所有主鍵和外鍵,並基於此生成輸入字段和指向其他對話框的鏈接。因爲它應該是一個通用的解決方案,所以它應該與任何確實彼此之間具有有意義關係的表集一起工作。SQL信息模式 - 閱讀複合外鍵

我遇到的一件事是外鍵,特別是 - 在一個約束下的複合外鍵。舉例來說,如果我有以下表格:

公司

CompanyID, CompanyName, CompanyID 
--companyID is the primary key which identifies the company. 

DivisionID, CompanyID, DivisionName, DivisionID+CompanyID 
--DivisionID+CompanyID is a composite primary key for a division, because it's a one-to-many relationship and division is DEPENDENT on Company. 

TeamID, DivisionID, CompanyID, TeamName, TeamID+DivisionID+CompanyID 
--same as above - a Team is dependent on Division, which has a composite primary key. 

現在,這個數據庫模型 - 通過所有的定義 - 一個有效的模型(和SQL Server允許它) - 但我遇到了一定的問題。

例如,在信息模式中,DivisionID和CompanyID都被分配到相同的CONSTRAINT。所以,當我加入合適的桌子時,我遇到了一個問題。沒有辦法知道一個表中的哪一列是另一列中的哪一列。在上面的例子中,列名是相同的(CompanyID是與公司ID相關的每一列的名稱 - 無論是在公司表或TEAM表中,等等),但是,沒有規則說列的名字必須是相同的,所以我對如何讓程序知道哪個列是哪個列表感到困惑。

TABLE1 COLUMN1  CONSTRAINT   TABLE2  COLUMN2 
TEAM  CompID  TEAM_HAS_DIVISION DIVISION CompanyID 
TEAM  DivID  TEAM_HAS_DIVISION DIVISION DivisionID 

有沒有辦法讓電腦知道CompID表TEAM引用CompanyID,而不是在分配表DivisionID?

我無法從INFORMATION_SCHEMA視圖中的數據中找到任何方法。

是的,一個人可以很容易地找出CompID = CompanyID等......但正如我前面提到的 - 我試圖制定一個通用的解決方案,不需要一個人來看這個和做出決定和錯誤:=)

回答

2

你必須按列順序匹配它們。

  • REFERENTIAL_CONSTRAINTS告訴你TEAM_HAS_DIVISION約束具有PK_Division作爲主鍵
  • KEY_COLUMN_USAGE告訴你TEAM_HAS_DIVISION有DIVID和CompID的順序,按ORDINAL_POSITION列
  • KEY_COLUMN_USAGE也會告訴你PK_Division有DivisionID和規定CompanyID,按ORDINAL_POSITION列指定

這就是你如何知道哪一個是指哪一個。

+0

感謝您的回答,我想到了訂單(ordinal_position),但我不確定是否有任何擔保。例如,什麼能阻止數據庫設計者在一個表中以相反順序放置列?或者,服務器是否要求複合鍵順序是某種方式? – Iv4n 2011-04-14 09:46:06

+0

親自試一試。您可以按任意順序將列放入主鍵中,但不能以與您所引用的主鍵不同的順序創建列的外鍵。 – 2011-04-14 10:30:50

+0

謝謝ZSEPRI,我剛剛看到KEY表中的ORDINAL_POSITION指的是Key內的位置,而不是表中的位置。所以,儘管它們在桌子上是「顛倒的」,但它們卻是關鍵所在。非常感謝!! :) – Iv4n 2011-04-14 10:32:04