在 SQL Server 2014 中将一个外键引用到多个主键
Reference one foreign key to multiple primary keys in SQL Server 2014
我的数据库中有三个 table。
- MedicalTest [MedicalTestID PK]
- SportTest [SportTestID PK]
- GeneralNeeds [GeneralNeedsID PK]
在GeneralNeeds
里面有ProcessID
需要保留MedicalTestID
和SportTestID
GUID。
一旦我从 table 中插入一个现有的 GUID,我就会收到 "Conflict" 错误消息,我认为这意味着给定的 GUID 在另一个 table 中不存在.
例如:如果我从 MedicalTest
插入 GUID,那么它会告诉我 SportTest
没有给定的 GUID。
是否可以将多个键引用到一列?
我在这里推荐的设计是 table/sub-table 解决方案。这意味着,引入第 4 个 table、Test
。 Test
table 只是作为一个 table 将所有不同的测试类型链接在一起。如果您熟悉面向对象编程,可以将其视为基本类型。因此,从本质上讲,您的 ProcessID
指向 Test
,然后指向其中一种特定的测试类型(SportsTest、MedicalTest、WhateverTest)。如果愿意,您还可以在 Test
table 中包含一个 Type
以帮助您了解它是哪种类型的测试。这里有一个关键的事情:在MedicalTest
和SportsTest
table中,主键(比如MedicalTestID
)也是指向[=19=的外键] 在 Test
。通过这种方式,您可以在 GeneralNeeds
中使用单个列,因为引用是对单个 table 类型 Test
的引用。由于 Test
和相应的 MedicalTest
或 SportsTest
具有相同的主键,您可以轻松地进行查询所需的连接。
这是一个示例图来说明它:
简单的例子:
假设您有一个 ID 为 1 的 MedicalTest
(让我们暂时忘记 GUID 以使其更易于阅读)
然后,您还会在 Test
中拥有 ID 为 1 的记录。
然后 1 的 ProcessID
确实指向 Test
记录,然后您可以将其加入 MedicalTest
记录。
如果您仍然感到困惑,请告诉我,我会尝试添加更多细节,但希望这能让您朝着可行的方向前进。
我的数据库中有三个 table。
- MedicalTest [MedicalTestID PK]
- SportTest [SportTestID PK]
- GeneralNeeds [GeneralNeedsID PK]
在GeneralNeeds
里面有ProcessID
需要保留MedicalTestID
和SportTestID
GUID。
一旦我从 table 中插入一个现有的 GUID,我就会收到 "Conflict" 错误消息,我认为这意味着给定的 GUID 在另一个 table 中不存在.
例如:如果我从 MedicalTest
插入 GUID,那么它会告诉我 SportTest
没有给定的 GUID。
是否可以将多个键引用到一列?
我在这里推荐的设计是 table/sub-table 解决方案。这意味着,引入第 4 个 table、Test
。 Test
table 只是作为一个 table 将所有不同的测试类型链接在一起。如果您熟悉面向对象编程,可以将其视为基本类型。因此,从本质上讲,您的 ProcessID
指向 Test
,然后指向其中一种特定的测试类型(SportsTest、MedicalTest、WhateverTest)。如果愿意,您还可以在 Test
table 中包含一个 Type
以帮助您了解它是哪种类型的测试。这里有一个关键的事情:在MedicalTest
和SportsTest
table中,主键(比如MedicalTestID
)也是指向[=19=的外键] 在 Test
。通过这种方式,您可以在 GeneralNeeds
中使用单个列,因为引用是对单个 table 类型 Test
的引用。由于 Test
和相应的 MedicalTest
或 SportsTest
具有相同的主键,您可以轻松地进行查询所需的连接。
这是一个示例图来说明它:
简单的例子:
假设您有一个 ID 为 1 的 MedicalTest
(让我们暂时忘记 GUID 以使其更易于阅读)
然后,您还会在 Test
中拥有 ID 为 1 的记录。
然后 1 的 ProcessID
确实指向 Test
记录,然后您可以将其加入 MedicalTest
记录。
如果您仍然感到困惑,请告诉我,我会尝试添加更多细节,但希望这能让您朝着可行的方向前进。