Я должен мигрировать большое количество существующих данных в Postgres DB после изменения схемы.
В старой схеме атрибут страны будет храниться в таблице пользователей. Теперь атрибут страны был перемещен в отдельный адресную таблицу:
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;
Как раз распространять идентификаторы вставленных строк и установите ссылки на иностранные ключи в таблице пользователей?
Единственное решение, которое я мог сделать до сих пор, создает временный столбец user_id в таблице адресов, а затем обновление адреса_id:
UPDATE users SET address_id = a.id FROM addresses AS a
WHERE users.id = a.user_id;
Однако это оказалось чрезвычайно медленным (несмотря на использование индексов на обоих пользователях. ID и адрес .user_id).
Таблица пользователей содержит около 3 миллионов строк с 300K отсутствуют связанный адрес.
Есть ли другой способ вставить производные данные в одну таблицу и устанавливать ссылку на внешний вид на вставленные данные в другой (без изменения самой схемы)?
Я использую Postgres 8.3.14.
Спасибо
Теперь я решил проблему путем миграции данных с помощью сценария Python / SQLALCHEMY. Оказалось намного проще (для меня), чем пробовать то же самое с SQL. Тем не менее, мне было интересно, если кто-нибудь знает способ обрабатывать возврат результата оператора вставки в Postgres SQL.