PostgreSQL 中的序列(Sequence)详解
PostgreSQL 的序列(Sequence)是一个数据库对象,用于生成唯一的数值,通常用作表中字段的自增主键值。它独立于表存在,可以被多个表或字段共享。
主要用途
- 自动生成唯一ID 常用于 PRIMARY KEY 字段,如 id SERIAL 实际上就是使用了序列。
- 支持多表共享 一个序列可以被多个表引用,适用于需要跨表统一编号的场景。
- 可控性高 可设置起始值、步长、最大值/最小值、循环等属性。
示例
-- 创建一个序列
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)
);
-- 多个表可以共享同一个序列
使用注意点
- 对于设置里序列值的字段尽量不要进行赋值插入操作
-- 执行如下语句
INSERT INTO users ("id","name") values (3,'张三');
-- 查看序列值
SELECT nextval('users_id_seq');
-- 发现这个序列值并没有进行更新,就会造成后续的冲突