我正在尝试将数据从Excel电子表格导出到相当复杂的关系数据库中。电子表格通过声明其他对象的名称来指示“外键”。 (幸运的是,我对电子表格有一些控制权,所以我可以保证这些名称是唯一的,并且它们引用的对象实际存在)。
我有一个程序可以在MSSql数据库中重新创建这些表,但它不能自动将它们相互链接。此外,我不想使用对象的实际名称作为主键,因为最终数据库将很大。
因此,如果我有许多现有但未连接的表通过其“名称”字段相互引用,我如何添加一个通过其ID链接它们的外键?
我所拥有的简化版本:
Parent
ID: 1 (PK)
Name: Mary
Child
ID: 2 (PK)
Name: Jane
ParentName: Mary
我想要实现的目标:
Child
ID: 2 (PK)
Name: Jane
ParentID: 1 (FK)
感谢您的帮助!我无法找到如何在事后添加外键映射或在不同字段上添加外键映射的示例。
答案 0 :(得分:5)
请参阅MSSQL的ALTER TABLE
语法。你可以想出这样的东西来将约束添加到表中:
ALTER Child
ADD CONSTRAINT Child_Parent_FK FOREIGN KEY (ParentID) REFERENCES Parent(ID)
然后一旦约束进入,尝试类似:
UPDATE Child
SET ParentID = (SELECT ID FROM Parent WHERE Name = ParentName)
如果您可以保证Parent的Name
是唯一的,那么这应该有效。否则,您可以将LIMIT 1
添加到查询的末尾。但如果有多个父级具有相同的Name
,则您需要添加额外的逻辑(原始帖子中未指定)。
答案 1 :(得分:1)
由于您将定期执行此操作,我认为您应该导入临时表。我喜欢在自己的架构中隔离登台表。
使用登台表检索或生成所需的密钥,然后根据登台表中的数据插入/更新OLTP表。最后,截断登台表。