2017-05-18 25 views
0

我有一個包含數百萬條記錄的postgres表。現在我想用名爲「time_modified」的另一列「last_event_time」中的值添加新列。運行遷移腳本需要很長時間,因此需要一個簡單的解決方案來運行生產。Postgres:如何在更改表格時將列默認值設置爲另一列值

+0

沒有 「單純」 的解決方案。唯一的方法是在添加列後運行'update'。 –

+0

你怕別人過程阻擋表嗎? –

+0

由於數據庫對於客戶端應用程序至關重要,所以不能長時間鎖定表格 –

回答

1

假設列是時間戳你可以試試:

alter table my_table add time_modified text; 
alter table my_table alter time_modified type timestamp using last_event_time; 
+0

更新是否更高效? 「alter table」在表上使用獨佔鎖,而更新至少允許在更新運行時從中進行選擇。 –

+0

這取決於服務器負載和其他客戶端。一旦我們獲得鎖定,操作應該比更新快得多。我會在週日凌晨4點這樣做;) – klin

+0

感謝klin。這個解決方案比更新更好,但只關心鎖定表。有沒有更好的選擇? –

0

我建議用pg_sleep使用功能,這在環路之間iteriation等待

這樣不調用專用鎖等鎖住your_table。

SELECT pg_sleep(seconds);

執行的時間不過長

alter table my_table add time_modified timestamp; 

CREATE OR REPLACE FUNCTION update_mew_column() 
    RETURNS void AS 
$BODY$ 
DECLARE 
    rec record; 

BEGIN 
    for rec in (select id,last_event_time from your_table) loop 

     update your_table set time_modified = rec.last_event_time where id = rec.id; 
     PERFORM pg_sleep(0.01); 

    end loop; 
END; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 

和執行功能:

select update_mew_column(); 
+1

這隻會增加鎖的持續時間。 –

相關問題