PostgreSQL 中的序列(Sequence)详解

PostgreSQL 的序列(Sequence)是一个数据库对象,用于生成唯一的数值,通常用作表中字段的自增主键值。它独立于表存在,可以被多个表或字段共享。

主要用途

  1. 自动生成唯一ID 常用于 PRIMARY KEY 字段,如 id SERIAL 实际上就是使用了序列。
  2. 支持多表共享 一个序列可以被多个表引用,适用于需要跨表统一编号的场景。
  3. 可控性高 可设置起始值、步长、最大值/最小值、循环等属性。

示例

-- 创建一个序列
CREATE SEQUENCE sequence_test
  START 100
  INCREMENT BY 10
  MAXVALUE 200
  CYCLE;
-- START 设置序列的起始值
-- INCREMENT BY 设置每次递增的步长为 10
-- MAXVALUE 设置序列的最大值 如果设置了 CYCLE,则从最小值重新开始;如果没有设置,则会报错
-- CYCLE 表示循环模式

-- 生成下一个序列值
SELECT nextval('sequence_test');

-- 获取当前的序列值
SELECT currval('sequence_test');

-- 设置序列值
SELECT setval('sequence_test', 110);

-- 获取序列值的详细信息
SELECT * FROM pg_sequences WHERE schemaname = 'public' AND sequencename = 'sequence_test';

序列值在表中的使用

-- PostgreSQL 提供了 SERIAL 伪类型,它会自动为你创建一个序列,并将该序列作为字段的默认值
CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  name VARCHAR(100)
);
-- 这条语句将自动 创建一个序列(如 users_id_seq)将 id 字段的默认值设置为 nextval('users_id_seq')

-- 显式绑定已有序列
CREATE TABLE users (
  id INT DEFAULT nextval('sequence_test'),
  name VARCHAR(100)
);
-- 多个表可以共享同一个序列

使用注意点

  1. 对于设置里序列值的字段尽量不要进行赋值插入操作
-- 执行如下语句
INSERT INTO users ("id","name") values (3,'张三');
-- 查看序列值
SELECT nextval('users_id_seq');
-- 发现这个序列值并没有进行更新,就会造成后续的冲突
posted @ 2025-07-14 16:12  元気田支店长  阅读(139)  评论(0)    收藏  举报