我目前正在重建一个用于存储患者记录的数据库。在当前数据库中,患者的主要关键是他们的姓名和出生日期(单列,即“John Smith 1970-01-01”,它不是复合的)。这也是许多其他表中引用患者表的外键。我打算用自动生成的整数键替换这个键(因为在当前系统下一天显然会有重复的键)。如何向此表添加新主键并在所有其他表上添加适当的外键?请记住,已经存在大量数据(约500,000条记录),并且这些数据引用无法被破坏。
谢谢!
答案 0 :(得分:1)
如果由我决定..
使用auto_increment将新的future-PK列添加为非null唯一索引(it must be a KEY, but not necessarily the PK)。
将相应的new-FK列添加到所有相关表中,这些列最初可以为空。
根据当前PK / FK关系将new-FK值设置为适当的future-PK值。使用"UPDATE .. JOIN"执行此步骤。
在相关表格上启用Referential Integrity Constraints (DRI)。它只需要是KEY / FK,而不是PK / FK,这就是为什么可以使用未来的PK。 在此步骤中,可能会更新使用current-PK的每个现有DRI约束。
根据建模要求删除新的FK列可空性。
删除任何残留的旧FK列,因为它们现在是冗余数据。
切换旧PK和新/未来PK(this can be done in one command,可能需要一段时间来物理重新组织所有行)。删除旧的PK列(如果适用),或者只是删除KEY状态。
我还会在此过程中离线数据库,审核并测试过程(使用测试数据库进行干运行),维护备份< / em>的
数据访问层和任何视图/等也需要更新。这些应该同时进行,再次通过审查和测试过程。
此外,即使添加自动增量PK,该表通常仍然具有使用唯一约束强制执行的适当覆盖自然键。
答案 1 :(得分:0)
我使用以下方法解决了问题:
1-已分配为患者表添加了新的主键,并为所有现有记录分配了唯一值
2-为每个引用表创建物化视图(无触发器),其中包括引用表中的所有字段以及患者表中新创建的id字段(通过连接)。
3-删除了源引用表
4-将物化视图重命名为原始源表的名称
物化视图现在是从属表。