Postgresql
在 Postgres 中用連續索引填充一列
想像一下下面的表格:
tmp_migration.asset
╔══════════╦══════════════════════════╗ ║ id ║ ...many other columns... ║ ╠══════════╬══════════════════════════╣ ║ 15 ║ ... ║ ║ 16 ║ ... ║ ║ 17 ║ ... ║ ║ 18 ║ ... ║ ║ 10020 ║ ... ║ ║ 10021 ║ ... ║ ╚══════════╩══════════════════════════╝
你看,索引不是從 1 開始,有間隙等等。
問題
我想添加一個
tempId
具有連續索引的新列。該表有 80m 行。我怎樣才能做到這一點?我用Google搜尋了很多東西,結果一無所獲。背景
該表是數據遷移項目的一部分。
tmp_migration
是作為數據遷移源創建的臨時模式。在目前步驟中,我嘗試在進行數據轉換時從tmp_migration.asset
to複製。public.asset
我正在為此使用組合INSERT INTO ... SELECT ...
查詢。問題是,它需要幾個小時(80m 行),並且在執行期間我沒有收到任何進度通知。為了解決這個問題,我想使用“分頁”。在使用插入/選擇腳本呼叫的 bash 中
psql
,我創建了一個循環來設置傳遞給腳本的邊界。我開始通過添加使用限制/偏移
LIMIT :limit OFFSET :offset;
到腳本,但是在更高的“頁面”之後,這會大大減慢。因此,建議
WHERE
在您的 PK 上使用超出限制/偏移量。但是,為此我需要一個連續的 PK,而我沒有。因此,我想到了添加一個臨時一致索引。也許還有其他我現在看不到的解決方案。會很高興得到幫助。
展示:
CREATE TABLE test (id INT PRIMARY KEY, other_field INT); INSERT INTO test VALUES (3,333),(55,555),(777,777); SELECT * FROM test;
ALTER TABLE test ADD COLUMN continuous INT; SELECT * FROM test;
UPDATE test SET continuous = calculate_rownumber.rownumber FROM ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) rownumber FROM test ) calculate_rownumber WHERE test.id = calculate_rownumber.id; SELECT * FROM test;
db<>在這裡擺弄