Вставьте данные и установите внешние ключей с Postgres

Я должен мигрировать большое количество существующих данных в 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.

12
задан Pankrat 13 September 2011 в 12:25
поделиться