我正在寻找任何提示和建议,当涉及到迁移从数字ID的UUID的在埃克托。
我有一个项目,有大量的关系,我不能简单地删除数据库,并重新创建它与UUID的,这似乎是一个最简单的解决方案,因为我必须保持数据。
我的想法是:
1.将:uuid, :uuid
字段添加到表中
1.使用脚本和Ecto.UUID.generate()
填充:uuid
列
1.将表格修改为(:some_table, primary_key: false)
,将字段修改为::uuid, :uuid, primary_key: true
,并删除:id
字段。
1.将:uuid
字段重命名为:id
虽然在我看来它看起来很完美,但我当然忘记了引用。有没有什么方法可以轻松地处理引用,从数字ID到UUID的迁移?我想到的唯一想法是创建额外的表,其中将包含旧ID和新UUID之间的第2和第3步,然后删除旧引用并基于创建的表添加新引用。我将感谢任何建议:)
1条答案
按热度按时间qf9go6mv1#
如果你有一个选项可以让数据库从外部进入只读状态一段时间,这应该不会太难。
1.删除所有外键约束
1.将
:uuid, :uuid
字段添加到表中1.将表格修改为
primary_key: false
1.将触发器置于
UPDATE
上,将 * 所有 * 引用表的fk
值更新为插入值1.使用类似
gen_uuid()
的DB过程填充:uuid
列1.将
:uuid
设为主键(并删除:id
)1.将
:uuid
字段重命名为:id
∞.将所有外键放回原位。
最好使用纯SQL(保存用于ecto模式更新)来完成整个工作。