Postgres:如何在更改表时将列默认值设置为另一个列值

时间:2017-05-18 06:14:00

标签: sql postgresql

我有一张包含数百万条记录的postgres表。现在,我想在该表中添加名为“time_modified”的新列,并在另一列“last_event_time”中添加值。运行迁移脚本需要很长时间,因此需要一个简单的解决方案才能在生产中运行。

2 个答案:

答案 0 :(得分:1)

假设列是时间戳,您可以尝试:

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

答案 1 :(得分: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();