替换其他表中作为外键的主键
Posted
技术标签:
【中文标题】替换其他表中作为外键的主键【英文标题】:Replace primary key that is foreign key in other tables 【发布时间】:2014-05-05 12:05:16 【问题描述】:我目前正在重建一个用于存储患者记录的数据库。在当前数据库中,患者的主键是他们的姓名和出生日期(单列,即“John Smith 1970-01-01”,它不是复合的)。这也是许多其他表中引用患者表的外键。我打算用一个自动生成的整数键替换这个键(因为在当前系统下有一天显然会有重复的键)。如何向该表添加新主键并在所有其他表上添加适当的外键?请记住,已经有大量数据(约 500,000 条记录),这些数据引用不能被破坏。
谢谢!
【问题讨论】:
【参考方案1】:如果由我决定..
使用 auto_increment 添加新的 future-PK 列作为非空唯一索引 (it must be a KEY, but not necessarily the PK)。
向所有相关表中添加适当的 new-FK 列,这些列最初应该可以为空。
根据当前-PK/FK 关系将新-FK 值设置为适当的未来-PK 值。在此步骤中使用 "UPDATE .. JOIN"。
在相关表上启用Referential Integrity Constraints (DRI)。只需要KEY/FK,不用PK/FK,这也是future-PK可以用的原因。 每个使用当前 PK 的现有 DRI 约束可能会在此步骤中更新。
根据建模要求删除新的 FK 列可空性。
删除所有残留的旧 FK 列,因为它们现在是冗余数据。
切换 old-PK 和 new/future-PK(this can be done in one command 并且可能需要一些时间来物理重组所有行)。根据需要删除旧的 PK 列,或者干脆删除 KEY 状态。
我还将在此过程中使数据库脱机,审查和测试该过程(使用测试数据库进行试运行),并维护备份。
数据访问层和任何视图/等也需要更新。这些应该同时完成,再次通过审查和测试过程。
此外,即使在添加自动增量 PK 时,表通常仍然具有适当的覆盖自然键,并强制执行唯一约束。
【讨论】:
【参考方案2】:我使用以下方法解决了这个问题:
1- Assigned 为患者表添加了一个新的主键,并为所有现有记录分配了唯一值
2- 为每个引用表创建物化视图(无触发器),包括引用表中的所有字段以及患者表中新创建的 id 字段(通过连接)。
3- 删除源引用表
4- 将物化视图重命名为原始源表的名称
物化视图现在是依赖表。
物化视图参考:http://www.fromdual.com/mysql-materialized-views
【讨论】:
Nit: No Materialized Views 是因为 MySQL 不支持物化视图而创建的。您所做的是创建新表,复制数据(重新建立关系),然后删除旧表。跨度> @user2864740 虽然 MySQL 本身不提供对物化视图的支持,但可以通过按照您描述的方法复制数据并可选地添加触发器来适当地刷新表来实现它们。为了简单起见,我将我的过程描述为使用物化视图。 fromdual.com/mysql-materialized-views 呃,不,即使用 tables 到simulate - “假设或具有” - 物化视图 (fsvo) 的外观或特征,如上述步骤。同样,表格和物化视图是不同的东西。此外,在这种情况下,除了新表之外,“MV”没有用于任何事件。以上是关于替换其他表中作为外键的主键的主要内容,如果未能解决你的问题,请参考以下文章