标识列
PostgreSQL 中的标识列(identity column)是什么?
标识列的值由一个隐式序列自动生成。这是在 PostgreSQL 中创建自增键的 SQL 标准方式。
标识列使用 GENERATED ALWAYS AS IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY 声明。PostgreSQL 会为其关联一个隐式序列,每当插入操作没有提供值时,就用该序列填充该列。
使用 GENERATED ALWAYS 时,INSERT 中显式提供的值会被拒绝,除非语句中写明 OVERRIDING SYSTEM VALUE;使用 BY DEFAULT 时,显式提供的值优先。标识列遵循 SQL 标准,而 serial 是 PostgreSQL 特有的较旧简写。与任何序列一样,被回滚的事务用掉的编号不会被重用,因此出现空缺是正常的。
示例
该示例插入两行不带 id 的数据,返回生成的值,并显示该列背后的序列名称。
CREATE TABLE tickets (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
subject text NOT NULL
);
INSERT INTO tickets (subject) VALUES ('first'), ('second') RETURNING id;
SELECT pg_get_serial_sequence('tickets', 'id');适用于原生 PostgreSQL 16 或 17 的纯 SQL,无需任何扩展。请在一个可随时丢弃的空数据库中运行。
参考资料
PostgreSQL 官方文档(英文)。