首页 > 解决方案 > 有没有办法使用 SQL 定义使用 2 个非唯一列的 2 个表之间的关系

问题描述

在数据库的实际面试练习中,我得到了 2 个 CSV 文件,其中一个用于药物分配,显示患者的独特实例(患者 ID 列是唯一的)使用以下项目访问药物

drug_dispensation (facility_code,patient_id,weight,date,DOB)

另一个 CSV 文件设施详细信息显示了每位患者获取药物的设施的独特实例

设施详情(设施名称、设施代码、地区)

这个想法是设计一个包含 2 个表的数据库并在两者之间建立关系。查看 2 个文件的结构,常见的列是 facility_code 列。但是,facility_details 中的条目并非都是唯一的,因为 2 个保健中心共享相同的代码“MON”。

由于我们必须在创建关系后导入数据,因此外键约束出现错误,指出两个表无法关联,因为 facility_details 中没有唯一引用列。

ALTER TABLE drug_dispensation
ADD CONSTRAINT FOREIGN KEY (facility_code) REFERENCES facility_details(facility_code)

错误:被引用的表 facility_details 中没有与引用列列表匹配的主键或候选键

有没有办法可以在两个表之间建立关系?

标签: sqlsql-serverpostgresqlforeign-keysreferential-integrity

解决方案


结构和设置听起来大多是合理的,所以你被评估的部分内容大概是你如何处理无效数据。

您已经完成了所有正确的事情来识别导致您失败的重复项,现在您需要就如何处理它进行调用。

例如,删除其中一个,或者如果它应该是明显的,则修改设施代码 - 并确保记录您所做的任何更改。

您可以在加载数据之前删除约束,然后对其进行修改,然后添加约束......或者您可以按原样加载到临时表,在那里修改数据,然后加载到目标表。

我想说的是,你说 patient_id 列在 drug_dispensation 中是唯一的,但它看起来设置为允许每位患者有多个记录(例如,在不同的日期和/或在不同的设施)。我认为拥有三个表最有意义 - Patient_details(患者 ID、出生日期...等)、Facility_details(设施名称、设施代码、地区)和药物分配(设施代码、患者 ID、日期)。体重可以输入到 patient_details 或 drug_dispensation 中,具体取决于它是在分配时获取的,还是该患者的固定值。


推荐阅读