我有一个相当大的数据库,其中一个主表具有一个单列 GUID(自定义 GUID 类似算法)作为主键和 8 个与此 GUID 列具有外键关系的子表。所有表都有大约 3-8 百万条记录。这些表都没有任何 BLOB/CLOB/TEXT 或任何其他花哨的数据类型,只有普通数字、varchars、日期和时间戳(每个表中大约 15-45 列)。除了主键和外键之外,没有分区或其他索引。
现在,自定义 GUID 算法已更改,尽管没有冲突,但我想迁移所有旧数据以使用使用新算法生成的 GUID。无需更改其他列。第一要务是数据完整性,性能是次要的。
我能想到的一些可能的解决方案是(你可能会注意到它们都只围绕一个想法)
- 添加新列 ngu_id 并使用新的 gu_id 填充;禁用约束;用 ngu_id 作为 gu_id 更新子表;重命名 ngu_id->gu_id;重新启用约束
- 从子表中读取一个主记录及其从属子记录;用新的 gu_id 插入同一张表;删除所有旧 gu_id 的记录
- 丢弃约束;向主表添加触发器,以便更新所有子表;开始用新的新 gu_id 更新旧的 gu_id;重新启用约束
- 向主表添加触发器,以便更新所有子表;开始用新的新 gu_id 更新旧 gu_id
- 在所有主表和子表上创建新列 ngu_ids;在 ngu_id 列上创建外键约束;向主表添加更新触发器以将值级联到子表;将新的 gu_id 值插入 ngu_id 列;移除基于 gu_id 的旧外键约束;删除 gu_id 列并将 ngu_id 重命名为 gu_id;必要时重新创建约束;
- 如果可用,使用
on update cascade
?
我的问题是:
- 有没有更好的办法?(不能把我的头埋在沙子里,必须这样做)
- 最合适的方法是什么?(我必须在 Oracle、SQL server 和 mysql4 中执行此操作,因此欢迎使用特定于供应商的 hack)
- 这种练习的典型失败点是什么以及如何将它们最小化?
如果你到目前为止和我在一起,谢谢你,希望你能帮助:)