我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
我知道添加具有默认值的新列是安全的。但是,与 结合使用它仍然安全NOT NULL
吗?还是会锁定数据库?谢谢!
我们有一个由 Postgresql v11.4提供支持的 Rails 应用程序,我想在其中添加一个具有默认值和非空约束的新列,如下所示:
ALTER TABLE "blogs" ADD "published" boolean DEFAULT FALSE NOT NULL
我知道添加具有默认值的新列是安全的。但是,与 结合使用它仍然安全NOT NULL
吗?还是会锁定数据库?谢谢!
这种说法是安全的。
ALTER TABLE 永远不会锁定“数据库”,它只会锁定表。
Postgres 实际上不会重写表,因为您
false
为默认值提供了一个常量值 ( )。所以添加列实际上是在几毫秒内完成的,因为 Postgres 只存储新列可用的信息。当该列被访问(并且没有可用的值)时,它将使用列定义中的默认值。仅当更新行时,新行才会包含该列的实际值。如果默认值是每行可能不同的表达式,Postgres 将重写表以物理地将默认列放入所有行。但是,这只会锁定表,而不是数据库。
来自Postgres 文档
ALTER TABLE
:“当添加列并指定ADD COLUMN
非易失性列时,默认值在语句执行时评估,结果存储在表的元数据中。该值将用于所有现有的列行。如果没有指定,则使用 NULL。在这两种情况下都不需要重写表。DEFAULT
DEFAULT
并在 Postgres v.11 中进行了测试:dbfiddle.uk