我需要在 Postgres 数据库中进行架构更改后,迁移大量现有数据。
在旧的架构中,国家属性会存储在用户表中。现在,国家属性已经被移动到一个单独的地址表中:
users:
country # OLD
address_id # NEW [1:1 relation]
addresses:
id
country
实际上模式更加复杂,地址包含的信息不仅仅是国家。 因此,每个用户都需要有自己的地址(1:1关系)。
在迁移数据时,我在插入地址后设置用户表中的外键遇到了问题:
INSERT INTO addresses (country)
SELECT country FROM users WHERE address_id IS NULL
RETURNING id;
如何传播插入行的ID并在用户表中设置外键引用?
目前我能想到的唯一解决方案是在地址表中创建一个临时的user_id列,然后更新address_id:
UPDATE users SET address_id = a.id FROM addresses AS a
WHERE users.id = a.user_id;
然而,尽管在用户.id和地址.user_id上使用了索引,但这种方法在执行过程中非常缓慢。
用户表包含约300万行数据,其中有30万行没有相关联的地址信息。
是否有其他方法可以将派生数据插入到一个表中,并将外键引用设置为另一个表中插入的数据(而不更改架构本身)?
我正在使用Postgres 8.3.14。
谢谢
我现在通过使用Python/sqlalchemy脚本迁移数据来解决了该问题。结果证明这比尝试使用SQL完成同样的操作要容易得多(对我而言)。不过,如果有人知道如何处理Postgres SQL中INSERT语句的RETURNING结果,请告诉我,我很感兴趣。