PostgreSQL 18 中文参考文档(未翻译部分保留英文)🌐 切换到英文原版 →

5.2. 默认值 #

可以为字段列显式指派默认值。当插入一条新数据行且未显式为某列赋值时,该列将被自动填充为预设的默认值。数据操作命令也可以在不关心具体默认值是什么的情况下,显式请求将某列设置为其默认值(详见 Chapter 6)。

如果未显式声明默认值,该列的默认值自动判定为空值(NULL)。这在绝大多数场景下是符合常理的,因为 NULL 在语义上即代表未知数据。

在建表定义中,默认值声明直接附加在列数据类型之后。例如:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric DEFAULT 9.99
);

默认值可以是一个动态表达式,该表达式在每次插入数据行时实时动态求值(而非建表时一次性求值)。典型的应用场景是将 timestamp 列的默认值设为 CURRENT_TIMESTAMP,从而自动记录写入时的系统时间戳。另一个极常见的需求是为数据行生成自增流水号:

CREATE TABLE products (
    product_no integer DEFAULT nextval('products_product_no_seq'),
    ...
);

其中的 nextval() 函数从底层的序列对象(sequence)中依次拉取连续递增的值(参见 Section 9.17)。由于该需求过于普遍,系统提供了专用的快捷简记语法:

CREATE TABLE products (
    product_no SERIAL,
    ...
);

关于 SERIAL 的更多细节参见 Section 8.1.4。