替换其他表中的外键主键

时间:2014-03-26 20:09:33

标签: mysql

我目前正在重建一个用于存储患者记录的数据库。在当前数据库中,患者的主要关键是他们的姓名和出生日期(单列,即“John Smith 1970-01-01”,它不是复合的)。这也是许多其他表中引用患者表的外键。我打算用自动生成的整数键替换这个键(因为在当前系统下一天显然会有重复的键)。如何向此表添加新主键并在所有其他表上添加适当的外键?请记住,已经存在大量数据(约500,000条记录),并且这些数据引用无法被破坏。

谢谢!

2 个答案:

答案 0 :(得分:1)

如果由我决定..

  1. 使用auto_increment将新的future-PK列添加为非null唯一索引(it must be a KEY, but not necessarily the PK)。

  2. 将相应的new-FK列添加到所有相关表中,这些列最初可以为空。

    1. 根据当前PK / FK关系将new-FK值设置为适当的future-PK值。使用"UPDATE .. JOIN"执行此步骤。

    2. 在相关表格上启用Referential Integrity Constraints (DRI)。它只需要是KEY / FK,而不是PK / FK,这就是为什么可以使用未来的PK。 在此步骤中,可能会更新使用current-PK的每个现有DRI约束。

    3. 根据建模要求删除新的FK列可空性。

    4. 删除任何残留的旧FK列,因为它们现在是冗余数据

  3. 切换旧PK和新/未来PK(this can be done in one command,可能需要一段时间来物理重新组织所有行)。删除旧的PK列(如果适用),或者只是删除KEY状态。

  4. 我还会在此过程中离线数据库审核并测试过程(使用测试数据库进行干运行),维护备份< / em>的

    数据访问层和任何视图/等也需要更新。这些应该同时进行,再次通过审查和测试过程。

    此外,即使添加自动增量PK,该表通常仍然具有使用唯一约束强制执行的适当覆盖自然键。

答案 1 :(得分:0)

我使用以下方法解决了问题:

1-已分配为患者表添加了新的主键,并为所有现有记录分配了唯一值

2-为每个引用表创建物化视图(无触发器),其中包括引用表中的所有字段以及患者表中新创建的id字段(通过连接)。

3-删除了源引用表

4-将物化视图重命名为原始源表的名称

物化视图现在是从属表。

物化视图的参考:http://www.fromdual.com/mysql-materialized-views