我必須在模式更改後遷移Postgres數據庫中的大量現有數據。插入數據並使用Postgres設置外鍵
在舊模式中,country屬性將存儲在users表中。現在全國的屬性已被移動到一個單獨的地址表:
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;
然而,這竟然是極其緩慢的(儘管在users.id和addresses.user_id上使用索引)。
用戶表包含大約300萬行,其中300k缺少關聯的地址。
是否有任何其他方式將派生數據插入到一個表中,並將插入數據的外鍵引用設置到另一個表中(而不更改模式本身)?
我使用的是Postgres 8.3.14。
感謝
現在我已經通過將數據與一個Python/SQLAlchemy的腳本遷移解決了這個問題。事實證明,對於我來說,要比使用SQL更容易。不過,如果有人知道在Postgres SQL中處理INSERT語句的RETURNING結果的方法,我會感興趣。
這是舊的,你解決了它。但在這種情況下1:1的關係是沒有意義的。你不應該創建一個國家表嗎? –
地址實際上包含每個用戶的街道,城市,郵編,...和國家。我只是簡化它,使其更具可讀性。 – Pankrat
國家,郵政編碼,城市,縣等都將擁有自己的表格。這留下了街道,號碼等。在這些單獨的表中仍然沒有任何意義,除非每個用戶可能有多個地址。 –