You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL中volatile default value(易失性默认值)指什么?

什么是PostgreSQL中的Volatile DEFAULT(易失性默认值)

在PostgreSQL里,Volatile DEFAULT的定义和函数的「稳定性级别」直接相关——PostgreSQL将函数分为三类稳定性等级,当你给新增列指定的默认值是调用Volatile级别的函数时,这个默认值就属于volatile DEFAULT:

函数的三类稳定性级别

  • Volatile(易失性):这类函数的返回值完全不可预测,单次查询内多次调用结果可能不同,甚至每次调用都会产生不一样的输出,还可能修改数据库状态。典型例子包括now()、random()、currval(),或者包含INSERT/UPDATE操作的自定义函数。
  • Stable(稳定):同一次查询里多次调用返回相同结果,但跨查询(比如不同事务、不同时间点)结果可能变化。比如current_date、基于静态表数据的查询函数。
  • Immutable(不可变):只要输入参数相同,无论何时调用返回结果都完全一致,不会受数据库状态或时间影响。比如lower()、abs()这类纯计算函数。

为什么Volatile DEFAULT需要重写表

结合你看到的ALTER TABLE文档逻辑:

  • 非易失性默认值(比如常量、Immutable/Stable函数的结果)可以在ALTER语句执行时一次性计算完成,把结果存在表的元数据里,现有行读取该列时直接用这个固定值,所以不需要重写表。
  • 但Volatile DEFAULT的函数每次调用结果都可能变,PostgreSQL没法预先计算一个固定值存在元数据里——它必须给表中每一行都单独计算并存储当前的函数结果,所以不得不重写整个表。

举例区分

属于Volatile DEFAULT的场景

-- now()是volatile函数,每次调用返回当前时间
ALTER TABLE users ADD COLUMN created_at TIMESTAMP DEFAULT now();
-- random()每次生成不同随机数
ALTER TABLE test ADD COLUMN rand_num INT DEFAULT floor(random() * 100);

添加这些列时,PostgreSQL会遍历全表,给每一行的新列计算并写入对应的时间/随机数,所以需要重写表。

属于非易失性DEFAULT的场景

-- 常量属于immutable级别
ALTER TABLE users ADD COLUMN status VARCHAR DEFAULT 'active';
-- abs(-100)是固定值,属于immutable计算
ALTER TABLE products ADD COLUMN discount INT DEFAULT abs(-10);

这类默认值是固定不变的,PostgreSQL只需要把值存在表元数据中,无需重写表。

内容的提问来源于stack exchange,提问作者Chris Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:10:29