Skip to content

PostgreSQL 序列管理

创建和使用序列

sql
-- 创建序列
CREATE SEQUENCE user_id_seq;

-- 使用序列获取下一个值
SELECT nextval('user_id_seq');

-- 使用序列获取当前值
SELECT currval('user_id_seq');

-- 设置序列值
SELECT setval('user_id_seq', 1000);

-- 在表创建时使用序列
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

-- 手动关联序列
CREATE TABLE orders (
    order_id BIGINT NOT NULL,
    order_number VARCHAR(20) UNIQUE
);

CREATE SEQUENCE order_id_seq;
ALTER TABLE orders ALTER COLUMN order_id SET DEFAULT nextval('order_id_seq');

序列配置

sql
-- 创建带配置的序列
CREATE SEQUENCE user_id_seq
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 10000000
    START WITH 1
    CACHE 20
    CYCLE;

-- 修改序列配置
ALTER SEQUENCE user_id_seq
    INCREMENT BY 2
    RESTART WITH 100
    CACHE 10;

-- 查看序列当前状态
SELECT last_value, start_value, min_value, max_value, 
       increment_by, cycle_count, cache_size
FROM user_id_seq;

-- 重置序列
ALTER SEQUENCE user_id_seq RESTART WITH 1;

序列函数

sql
-- 获取下一个值(推进序列)
SELECT nextval('user_id_seq');

-- 获取当前值(不推进序列)
SELECT currval('user_id_seq');

-- 获取最后使用的值
SELECT lastval();

-- 设置序列值
SELECT setval('user_id_seq', 5000);

-- 设置序列值并返回
SELECT setval('user_id_seq', 5000, true);

-- 检查序列是否存在
SELECT CASE WHEN sequence_exists THEN '存在' ELSE '不存在' END
FROM (SELECT to_regclass('user_id_seq') IS NOT NULL) AS t(sequence_exists);

常见问题(FAQ)

Q1: 序列值可以重复使用吗?

A1: 默认情况下不可以,设置CYCLE后可以重复使用。

Q2: 如何恢复误删的序列?

A2: 需要重新创建序列并设置适当的值。

Q3: SERIAL和BIGSERIAL有什么区别?

A3: SERIAL是INTEGER(4字节),BIGSERIAL是BIGINT(8字节)。