外观
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字节)。
