【问题标题】:Migration from numeric ID to UUID从数字 ID 迁移到 UUID
【发布时间】:2020-02-24 10:51:15
【问题描述】:

我正在寻找有关从数字 ID 迁移到 Ecto 中的 UUID 的任何提示和建议。

我有一个具有大量关系的项目,我不能简单地删除 db 并使用 UUID 重新创建它,这似乎是一个最简单的解决方案,因为我必须保留数据。

我的想法是:

  1. :uuid, :uuid 字段添加到表中

  2. 用脚本和Ecto.UUID.generate()填充:uuid

  3. 将表格修改为(:some_table, primary_key: false),将字段修改为::uuid, :uuid, primary_key: true,并删除:id字段。

  4. :uuid 字段重命名为:id

虽然在我看来它看起来很完美,但我当然忘记了参考。有什么方法可以通过从数字 ID 到 UUID 的迁移来轻松处理引用?我想到的唯一想法是创建额外的表,它将在第二步和第三步之间包含旧 ID 和新 UUID,然后删除旧引用并根据创建的表添加新引用。我将不胜感激任何建议:)

【问题讨论】:

    标签: postgresql elixir ecto


    【解决方案1】:

    如果您可以选择从外部将 DB 置于只读状态一段时间,这应该不会太难。不过,我不确定它是否适用于更新期间出现的新记录。

    0。删除所有外键约束

    1。将:uuid, :uuid 字段添加到表
    2。修改表为primary_key: false
    3。将触发器放在UPDATE 上,将所有引用表的fk 值更新为插入的值
    4。使用gen_uuid()
    5 之类的 DB 过程填充 :uuid 列。将:uuid 设为主键(并删除:id6。将:uuid 字段重命名为:id

    。将所有外键放回原处。

    最好用纯 SQL 来完成整个事情(除了 架构更新。)

    【讨论】:

      猜你喜欢
      • 2014-10-30
      • 2020-05-25
      • 2021-10-07
      • 2018-02-02
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      相关资源
      最近更新 更多