defmodule MyRepo.Migrations.ChangeFK do
def up do
MyRepo.query("""
CREATE UNIQUE INDEX CONCURRENTLY foo_pkey_idx ON foo(id);
ALTER TABLE foos
DROP CONSTRAINT foo_pkey,
ADD CONSTRAINT foo_pkey PRIMARY KEY USING INDEX foo_pkey_idx;
""")
end
def down do
raise "unreversible"
end
end
²有点像
defmodule MyRepo.Migrations.AlterFK do
def up do
MyRepo.query("""
ALTER TABLE bars DROP CONSTRAINT foo_pkey;
UPDATE bars SET foo_id = (SELECT uuid FROM foos WHERE id = foo_id);
ALTER TABLE bars
ADD CONSTRAINT foo_pkey
FOREIGN KEY (foo_id)
REFERENCES foos (uuid);
""")
end
def down do
raise "unreversible"
end
end
1条答案
按热度按时间3htmauhk1#
是的。可以通过几个步骤来完成任务,一些步骤对数据库执行原始SQL。
:uuid
(正常迁移)* 并 * 用唯一值填充它(例如,使用ecto UUID生成器)Ecto.Adapters.SQL.query/4
重新分配表中的主键¹id
更新为uuid
,* 然后 * 创建指向uuid
²的新外键来更新引用此表的所有其他表¹大致沿着以下思路(未测试)
²有点像