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

5.3. 标识列 #

标识列(Identity Column)是一种从隐式底层序列自动生成数值的特殊字段列,通常用于生成数据行的自增代理主键。

在 CREATE TABLE 中通过使用 GENERATED ... AS IDENTITY 子句声明标识列:

CREATE TABLE people (
    id bigint GENERATED ALWAYS AS IDENTITY,
    ...
);

或者:

CREATE TABLE people (
    id bigint GENERATED BY DEFAULT AS IDENTITY,
    ...
);

详细语法参见 CREATE TABLE。

当向包含标识列的表中执行 INSERT 插入、且未对标识列显式传值时,底层隐式序列自动生成递增数值并填入该列:

INSERT INTO people (name, address) VALUES ('A', 'foo');
INSERT INTO people (name, address) VALUES ('B', 'bar');

这将为 id 列自动从 1 开始生成数值:

 id | name | address
----+------+---------
  1 | A    | foo
  2 | B    | bar

此外,也可以在插入时显式声明关键字 DEFAULT 来请求系统生成序列值:

INSERT INTO people (id, name, address) VALUES (DEFAULT, 'C', 'baz');

列定义中的 ALWAYS 与 BY DEFAULT 决定了当用户显式指定自定义值时的处理逻辑。如果选择 ALWAYS,用户显式指定的值只有在语句附加了 OVERRIDING SYSTEM VALUE 时才会被允许写入,这提供了最高等级的数据保护;若选择 BY DEFAULT,则用户显式传入的值优先于自增生成值,其行为更类似于常规默认值。

标识列在底层自动被标记为 NOT NULL 非空。但标识列本身并不在物理上直接保证全局唯一(因为序列可以被手动重置,或者在特定配置下被手动覆写),如需确保唯一性,仍必须附加 PRIMARY KEY 或 UNIQUE 约束。

在表继承树中,子表的标识列独立于父表;而在分区表中,各个分区强制继承分区父表的标识列属性。