Inserte datos y configure claves externas con Postgres

Tengo que migrar una gran cantidad de datos existentes en una base de datos de Postgres después de un cambio de esquema.

En el esquema anterior, un atributo de país se almacenaría en la tabla de usuarios. Ahora el atributo de país se ha movido a una tabla de direcciones separada:

users:
  country # OLD
  address_id # NEW [1:1 relation]

addresses:
  id
  country

El esquema es en realidad más complejo y la dirección contiene más que solo el país. Por lo tanto, cada usuario debe tener su propia dirección (relación 1: 1).

Al migrar los datos, tengo problemas para configurar las claves externas en la tabla de usuarios después de insertar las direcciones:

INSERT INTO addresses (country) 
    SELECT country FROM users WHERE address_id IS NULL 
    RETURNING id;

¿Cómo propago los ID de las filas insertadas y establezco las referencias de clave externa en la tabla de usuarios?

La única solución que se me ocurrió hasta ahora es crear una columna temporal de ID de usuario en la tabla de direcciones y luego actualizar el ID de dirección:

UPDATE users SET address_id = a.id FROM addresses AS a 
    WHERE users.id = a.user_id;

Sin embargo, esto resultó ser extremadamente lento (a pesar de usar índices tanto en users.id como en direcciones.user_id).

La tabla de usuarios contiene alrededor de 3 millones de filas con 300k sin una dirección asociada.

¿Hay alguna otra forma de insertar datos derivados en una tabla y establecer la referencia de clave externa a los datos insertados en la otra (sin cambiar el esquema en sí)?

Estoy usando Postgres 8.3.14.

Gracia

Ahora he resuelto el problema migrando los datos con un script Python / sqlalchemy. Resultó ser mucho más fácil (para mí) que intentar lo mismo con SQL. Aún así, me interesaría si alguien conoce una manera de procesar el resultado RETORNO de una instrucción INSERT en Postgres SQL.

Respuestas a la pregunta(1)

Su respuesta a la pregunta