我正在處理通用應用程序,它使用一組預先選擇的數據庫表(及其關係)來生成用於管理這些表中數據的用戶界面。 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等......但正如我前面提到的 - 我試圖制定一個通用的解決方案,不需要一個人來看這個和做出決定和錯誤:=)
感謝您的回答,我想到了訂單(ordinal_position),但我不確定是否有任何擔保。例如,什麼能阻止數據庫設計者在一個表中以相反順序放置列?或者,服務器是否要求複合鍵順序是某種方式? – Iv4n 2011-04-14 09:46:06
親自試一試。您可以按任意順序將列放入主鍵中,但不能以與您所引用的主鍵不同的順序創建列的外鍵。 – 2011-04-14 10:30:50
謝謝ZSEPRI,我剛剛看到KEY表中的ORDINAL_POSITION指的是Key內的位置,而不是表中的位置。所以,儘管它們在桌子上是「顛倒的」,但它們卻是關鍵所在。非常感謝!! :) – Iv4n 2011-04-14 10:32:04