在 Postgres 14 中添加带有锁定表的列
NOT NULL DEFAULT X
并导致表重写吗?如果它不锁定表并导致表重写(假设它只是元数据更改),那么我想后续的模式操作可能会触发数据重写。我怀疑以下操作可能会触发重写:
NOT NULL
如果我从新列中删除约束会怎样?这会导致X
写入所有行吗?- 如果我将新列的默认值从更改为怎么办
X
?Y
在 Postgres 14 中添加带有锁定表的列NOT NULL DEFAULT X
并导致表重写吗?
如果它不锁定表并导致表重写(假设它只是元数据更改),那么我想后续的模式操作可能会触发数据重写。我怀疑以下操作可能会触发重写:
NOT NULL
如果我从新列中删除约束会怎样?这会导致X
写入所有行吗?X
?Y
从PostgreSQL v11开始,增加一个非 NULL 常量默认值的列不会重写表(如果
X
是非常量表达式,它会重写表)。自己测试总是很容易的:创建空表
查看表后面的文件名是什么:
运行
ALTER TABLE
语句再次检查文件名
如果文件名改变,语句重写表。
专门解决您的进一步问题:
adding 和 dropping 都不会
NOT NULL
rewrite table,但是前者必须扫描table,这也需要很长时间更改默认值永远不会重写表