标识列(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 约束。
在表继承树中,子表的标识列独立于父表;而在分区表中,各个分区强制继承分区父表的标识列属性。