将默认值添加到现有列或重命名列锁定 Postgres 表吗?

rob*_*sco 2 postgresql

我需要在 200 万行 Postgres 表上执行两次迁移,并且需要确保每次运行时停机时间最短,即少于 5 秒。

迁移是:

1) 添加默认值 0 并从 null 更改为非 null 到现有bigint 列

2)重命名列

注意:我发现很多帖子都说向大表添加具有默认值的新列会导致锁定,但不会向现有列添加默认值。

这些会锁定桌子吗?

Lau*_*lbe 6

该文档详细描述了哪个变体ALTER TABLE将使用哪个锁。

SET DEFAULTSET NOT NULL并且RENAME COLUMN都拿了ACCESS EXCLUSIVE锁。

这很不方便,但通常只会在ALTER TABLE语句需要很长时间时才糟糕。这两个SET DEFAULTRENAME COLUMN的速度快,但SET NOT NULL必须扫描表,以确定是否满足条件。


Lak*_*ain 5

我们知道默认值仅适用于后续的 INSERT 命令;它们不会导致表中已有的行发生变化。这意味着在将默认值设置为现有列时不会锁定表

请参阅https://www.postgresql.org/docs/9.1/static/sql-altertable.htmlSET/DROP DEFAULT部分

您也可以参考这篇文章了解大容量 PostgreSql 的安全操作。