跳到主要内容

PostgreSQL 自增列教程

自增列用于生成主键 ID。PostgreSQL 有三种实现:SERIAL 伪类型、显式序列(SEQUENCE)、SQL 标准 Identity 列。

本篇内容​

  • SERIAL / BIGSERIAL 伪类型
  • 显式序列 CREATE SEQUENCE 与 nextval
  • GENERATED ALWAYS / BY DEFAULT AS IDENTITY
  • 三者的差异与选型建议

SERIAL 伪类型​

-- SERIAL 是语法糖:建表时自动创建序列并设为默认值
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
name VARCHAR(50)
);

-- 插入时省略 id,自动从序列取值;也可显式指定
INSERT INTO users (name) VALUES ('Jack');

显式序列​

CREATE SEQUENCE user_id_seq START 1000 INCREMENT 1;

CREATE TABLE users (
id BIGINT NOT NULL DEFAULT nextval('user_id_seq'),
name VARCHAR(50)
);

-- 手动取值 / 重置
SELECT nextval('user_id_seq');
SELECT setval('user_id_seq', 100, false);

Identity 列(SQL 标准,推荐)​

CREATE TABLE users (
-- GENERATED ALWAYS:不允许显式插入 id(除非 OVERRIDING SYSTEM VALUE)
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50)
);
待补充(TODO)
  • 补充:序列的三个特性(不保证连续、不保证无空洞、回滚会留空洞)
  • 补充:GENERATED ALWAYS 与 BY DEFAULT 的行为差异
  • 补充:已有表添加自增列、以及 SERIAL 改 Identity 的迁移写法
  • 补充:自增 ID 与外键、分页、分布式场景的替代方案(UUID / 雪花 ID)