SQL信息架构 - 读取COMPOSITE外键

时间:2011-04-13 23:27:38

标签: sql foreign-keys composite-key information-schema

我正在使用通用应用程序,该应用程序使用一组预先选择的数据库表(及其关系)来生成用于管理这些表中数据的用户界面。基本上,我只是从信息模式中查找内容,获取所有主键和外键并生成输入字段和基于此的其他对话框的链接。因为它应该是一个通用的解决方案,所以它应该适用于彼此之间具有有意义关系的任何表集。

我遇到的一件事是外键,特别是 - 一个约束下的COMPOSITE外键。例如,如果我有以下表格:

公司

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相关的每一列的名称 - 无论是在COMPANY表中还是TEAM表中等等),但是,没有规则说列的名称必须相同,所以我不知道如何让程序知道哪个列是哪个。

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

有没有办法让计算机知道表TEAM中的CompID引用的是CompanyID,而不是DIVISION表中的DivisionID?

我无法从INFORMATION_SCHEMA视图中的数据中找到任何方法。

是的,一个人可以很容易地发现CompID = CompanyID等...但正如我之前提到的那样 - 我正在尝试制作一个通用的解决方案,不需要人来看这个并做出决定错误:=)

1 个答案:

答案 0 :(得分: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列指定

这就是你知道哪一个参考哪个。