是否会向现有列添加默认值或重命名列锁定Postgres表?

时间:2018-03-13 07:47:19

标签: postgresql

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

迁移是:

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

2)重命名一列

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

这些会锁定桌子吗?

2 个答案:

答案 0 :(得分:2)

The documentation详尽地描述了ALTER TABLE的哪个版本会采用哪种锁定。

SET DEFAULTSET NOT NULLRENAME COLUMN都会锁定ACCESS EXCLUSIVE

这很不方便,但如果ALTER TABLE语句需要很长时间,通常只会很糟糕。 SET DEFAULTRENAME COLUMN都很快,但SET NOT NULL必须扫描表格以确定是否符合条件。

答案 1 :(得分:1)

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

时,表上将没有锁定

参考https://www.postgresql.org/docs/9.1/static/sql-altertable.html SET / DROP DEFAULT 部分

您还可以参考this文章了解高容量PostgreSql的安全操作。