在SQL Server 2014中将一个外键引用到多个主键

时间:2015-09-07 00:42:56

标签: sql-server sql-server-2014

我的数据库中有三个表。

  1. MedicalTest [MedicalTestID PK]
  2. SportTest [SportTestID PK]
  3. GeneralNeeds [GeneralNeedsID PK]
  4. enter image description here

    SELECT Ass.NAME AS REGISTER_NAME, Ass.ASSET_NUM AS SMSF_NUM, CASE WHEN aXM.ATTRIB_44 IS NULL THEN NULL END AS SMSF_HOLDER_TYPE, CASE WHEN aXM.ATTRIB_44 IS NULL THEN NULL ELSE aXM.ATTRIB_44 END AS xCONDITION FROM siebel.s_asset Ass LEFT JOIN Siebel.S_ASSET_XM aXM on Ass.row_id = aXM.par_row_id WHERE Ass.NAME = 'SMSF Auditor' AND Ass.STATUS_CD = 'Registered' AND (aXM.ATTRIB_03 IS NULL OR aXM.ATTRIB_03 = 'Condition') 内,GeneralNeeds需要保留ProcessIDMedicalTestID GUID。

    一旦我从任何一个表中插入现有的GUID,我就会得到#34;冲突"错误消息,我认为这意味着给定的GUID不存在于另一个表中。

    例如:如果我从SportTestID插入GUID,那么它会告诉我MedicalTest没有给定的GUID。

    enter image description here

    是否可以将多个键引用到一列?

    enter image description here

1 个答案:

答案 0 :(得分:3)

我在此推荐的设计是表/子表解决方案。这意味着,引入第4个表TestTest表仅用作将所有不同测试类型链接在一起的表。如果您熟悉面向对象编程,请将其视为基本类型。基本上,您的ProcessID指向Test,然后指向特定测试类型之一(SportsTest,MedicalTest,WhateverTest)。如果您愿意,还可以在Type表中添加Test,以帮助您了解它是哪种类型的测试。这里有一个关键的问题:在MedicalTestSportsTest表中,主键(比如MedicalTestID)也是一个指向TestID Test的外键。 1}}。通过这种方式,您可以在GeneralNeeds中使用单个列,因为引用的是单个表类型Test。由于Test和相应的MedicalTestSportsTest具有相同的主键,因此您可以轻松地执行查询所需的联接。

以下是说明它的示例图:DB Diagram

简单示例: 假设你有一个ID为1的MedicalTest(让他们忘记一分钟的GUID,以便更容易阅读) 然后,您还会在Test中拥有ID为1的记录。 然后,ProcessID的1真正指向Test记录,然后您可以加入MedicalTest记录。

如果您仍然感到困惑,请告诉我,我会尝试添加更多细节,但希望这会让您朝着有效的方向前进。