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)