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,我刚才看到键表中的序号_位置指的是键内的位置,而不是表中的位置。因此,即使他们在桌子上“颠倒”,他们在钥匙上也是正确的。非常感谢!!:)