2017-05-18 24 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

这只会增加锁的持续时间。 –

相关问题