Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL信息架构-读取复合外键_Sql_Foreign Keys_Composite Key_Information Schema - Fatal编程技术网

SQL信息架构-读取复合外键

SQL信息架构-读取复合外键,sql,foreign-keys,composite-key,information-schema,Sql,Foreign Keys,Composite Key,Information Schema,我正在开发一个通用应用程序,它使用一组预先选择的数据库表(及其关系)来生成用于管理这些表中数据的用户界面。基本上,我只是从信息模式中查找内容,获取所有主键和外键,并在此基础上生成输入字段和指向其他对话框的链接。因为它应该是一个通用的解决方案,所以它应该与任何一组相互之间有意义关系的表一起工作 我遇到的一件事是外键,特别是在一个约束下的复合外键。例如,如果我有以下表格: 公司 CompanyID, CompanyName, CompanyID --companyID is the primary

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

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

公司

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都被“分配”到同一个约束。因此,当我加入正确的表时,我会遇到一个问题。无法知道一个表中的哪一列是另一个表中的哪一列。在上面的示例中,列名是相同的(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表中的DIVISION id

我无法从信息模式视图中的数据找到任何方法来执行此操作


是的,人类可以很容易地找出CompID=CompanyID,等等。。。但正如我前面提到的,我正在尝试一个通用的解决方案,它不需要一个人看这个问题,做出决定和错误:=)

你必须按列顺序匹配它们

  • 引用约束告诉您TEAM_具有除法约束,PK_除法是您的主键
  • KEY_COLUMN_用法告诉您TEAM_拥有按顺序排列的DivID和CompID,由ORDINAL_POSITION COLUMN指定
  • KEY_COLUMN_用法还告诉您,PK_Division具有按顺序排列的Division id和CompanyID,由ORDINAL_POSITION列指定

这就是你如何知道哪个是指哪个。

谢谢你的回答,我考虑了顺序(序数位置),但我也不确定是否有任何保证。例如,是什么阻止DB设计器在一个表中按相反顺序放置列?还是服务器强制复合密钥顺序是某种方式?请自己尝试。您可以将列按任何顺序放入主键中,但不能创建一个外键,其中列的顺序与您所引用的主键中的顺序不同。感谢ZSEPRI,我刚才看到键表中的序号_位置指的是键内的位置,而不是表中的位置。因此,即使他们在桌子上“颠倒”,他们在钥匙上也是正确的。非常感谢!!:)