postgresql 在不修改已写入的行的情况下向表添加默认值的列

uujelgoq  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(187)

我有一个postgresql 11 db的表,有70M+行。我想添加一个带有DEFAULT now()inserted_on列。但是,我希望该默认值仅应用于从此时开始插入的行(现有行应该为NULL)。有办法做到这一点吗?
我想把NULL留在那里有几个原因:

  • 重写整个表所需的时间(和停机时间)
  • 该值对于先前插入的行没有意义,因此我希望将其保留为NULL

有办法做到这一点吗?

f0brbegy

f0brbegy1#

如果您定义了默认值 after adding,则列现有行将不会更新。

alter table test add created_at timestamp;
alter table test alter created_at set default current_timestamp;

Online example

rlcwz9us

rlcwz9us2#

重写整个表所需的时间(和停机时间)
从postgres 11开始,postgres在添加具有 * 非易失性 * 默认值的列时实际上不需要重写表(例如不是1current_timestamp,但不是random()),它将只存储目录中的默认值,并将其用于没有列值的行。
如果旧行被更新,它将利用这个机会内联缺少的默认值。同样,如果整个表被重写(VACUUM FULL)。

相关问题