添加新列时使用不为空的默认值是否安全?

ogi*_*inc 6 postgresql null default-value alter-table postgresql-11

我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:

ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
Run Code Online (Sandbox Code Playgroud)

我知道添加具有默认值的新列是安全的。但是,与 组合使用仍然安全吗NOT NULL?或者它会锁定数据库吗?谢谢!

小智 7

该声明是安全的。

ALTER TABLE 永远不会锁定“数据库”,它只会锁定表。

Postgres 实际上不会重写该表,因为您false为默认值提供了一个常量值 ( )。因此添加列实际上在几毫秒内完成,因为 Postgres 只存储新列可用的信息。当访问该列时(并且没有可用值),它将使用该列定义中的默认值。仅当更新行时,新行才会包含该列的实际值。

如果默认值是每行可能不同的表达式,Postgres 将重写表以将默认列物理地放入所有行中。但是,这仍然只会锁定表,而不会锁定数据库。

来自Postgres 文档ALTER TABLE:“当添加列并指定ADD COLUMN非易失性时,将在语句时评估默认值,并将结果存储在表的元数据中。该将用于所有现有的列行。如果没有指定,则使用 NULL。在这两种情况下都不需要重写表。”DEFAULTDEFAULT

并在 Postgres v.11 中进行测试:dbfiddle.uk