序列 #
一、序列概述 #
1.1 序列概念 #
text
序列类型
┌─────────────────────────────────────────────────────────────┐
│ │
│ 序列: │
│ ├── 生成唯一数字序列 │
│ ├── 通常用于自增主键 │
│ └── 支持并发安全获取 │
│ │
│ CockroachDB 替代方案: │
│ ├── UUID: gen_random_uuid() │
│ ├── unique_rowid(): 分布式唯一ID │
│ └── 序列: 兼容PostgreSQL │
│ │
│ 注意事项: │
│ ├── 序列可能导致热点 │
│ ├── 推荐使用UUID │
│ └── 序列主要用于兼容性 │
│ │
└─────────────────────────────────────────────────────────────┘
二、创建序列 #
2.1 基本语法 #
sql
-- 创建简单序列
CREATE SEQUENCE user_seq;
-- 创建带参数的序列
CREATE SEQUENCE order_seq
START WITH 1000
INCREMENT BY 1
MINVALUE 1000
MAXVALUE 999999
NO CYCLE;
-- 创建序列选项
CREATE SEQUENCE my_seq
START WITH 1 -- 起始值
INCREMENT BY 1 -- 增量
MINVALUE 1 -- 最小值
MAXVALUE 1000000 -- 最大值
CYCLE; -- 达到最大值后循环
2.2 序列参数 #
| 参数 | 说明 | 默认值 |
|---|---|---|
| START WITH | 起始值 | 1 |
| INCREMENT BY | 增量 | 1 |
| MINVALUE | 最小值 | 1 或 -2^63 |
| MAXVALUE | 最大值 | 2^63-1 |
| CYCLE/NOCYCLE | 是否循环 | NO CYCLE |
| CACHE | 缓存数量 | 1 |
2.3 序列数据类型 #
sql
-- 指定数据类型
CREATE SEQUENCE small_seq AS SMALLINT;
CREATE SEQUENCE int_seq AS INT;
CREATE SEQUENCE big_seq AS BIGINT;
三、使用序列 #
3.1 获取序列值 #
sql
-- 获取下一个值
SELECT nextval('user_seq');
-- 获取当前值 (需要先调用 nextval)
SELECT currval('user_seq');
-- 设置序列值
SELECT setval('user_seq', 100);
-- 设置序列值但不推进
SELECT setval('user_seq', 100, false);
3.2 序列作为默认值 #
sql
-- 创建带序列的表
CREATE SEQUENCE user_id_seq;
CREATE TABLE users (
id BIGINT PRIMARY KEY DEFAULT nextval('user_id_seq'),
name VARCHAR(100),
email VARCHAR(100)
);
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
SELECT * FROM users;
-- id 自动从序列获取
3.3 序列关联 #
sql
-- 创建带序列的表 (SERIAL 风格)
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
order_no VARCHAR(50),
amount DECIMAL(10, 2)
);
-- SERIAL 自动创建序列
-- 等价于:
CREATE SEQUENCE orders_id_seq;
CREATE TABLE orders (
id BIGINT PRIMARY KEY DEFAULT nextval('orders_id_seq'),
order_no VARCHAR(50),
amount DECIMAL(10, 2)
);
ALTER SEQUENCE orders_id_seq OWNED BY orders.id;
四、管理序列 #
4.1 修改序列 #
sql
-- 修改序列参数
ALTER SEQUENCE user_seq
INCREMENT BY 2
RESTART WITH 100;
-- 重置序列
ALTER SEQUENCE user_seq RESTART;
-- 重置到特定值
ALTER SEQUENCE user_seq RESTART WITH 1;
-- 设置序列所有者
ALTER SEQUENCE user_seq OWNED BY users.id;
4.2 查看序列 #
sql
-- 查看序列信息
SELECT * FROM information_schema.sequences
WHERE sequence_name = 'user_seq';
-- 查看序列当前值
SELECT last_value FROM user_seq;
-- 查看所有序列
SELECT
sequence_schema,
sequence_name,
data_type,
start_value,
minimum_value,
maximum_value,
increment
FROM information_schema.sequences;
4.3 删除序列 #
sql
-- 删除序列
DROP SEQUENCE user_seq;
-- 如果序列被表使用,需要先删除表或修改默认值
DROP SEQUENCE IF EXISTS user_seq;
-- 强制删除 (如果有依赖)
DROP SEQUENCE user_seq CASCADE;
五、替代方案 #
5.1 UUID #
sql
-- 使用 UUID 作为主键 (推荐)
CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100),
email VARCHAR(100)
);
-- 优点:
-- - 分散写入,避免热点
-- - 全局唯一
-- - 无需序列管理
5.2 unique_rowid #
sql
-- 使用 unique_rowid
CREATE TABLE users (
id BIGINT PRIMARY KEY DEFAULT unique_rowid(),
name VARCHAR(100),
email VARCHAR(100)
);
-- 特点:
-- - 基于时间戳和节点ID
-- - 大致有序
-- - 分布式友好
5.3 对比 #
text
ID生成方案对比
┌─────────────────────────────────────────────────────────────┐
│ │
│ 序列: │
│ ├── 优点: 连续、有序 │
│ ├── 缺点: 热点问题 │
│ └── 适用: 兼容PostgreSQL │
│ │
│ UUID: │
│ ├── 优点: 分散写入、全局唯一 │
│ ├── 缺点: 无序、较长 │
│ └── 适用: 推荐 │
│ │
│ unique_rowid: │
│ ├── 优点: 大致有序、分布式友好 │
│ ├── 缺点: 可能冲突 │
│ └── 适用: 需要有序ID │
│ │
│ 建议: 优先使用 UUID │
│ │
└─────────────────────────────────────────────────────────────┘
六、最佳实践 #
6.1 使用建议 #
text
序列使用建议
┌─────────────────────────────────────────────────────────────┐
│ │
│ 1. 优先使用 UUID │
│ ├── 避免热点问题 │
│ └── 分布式友好 │
│ │
│ 2. 序列用于兼容场景 │
│ ├── 迁移PostgreSQL应用 │
│ └── 需要连续ID │
│ │
│ 3. 合理设置缓存 │
│ ├── 减少协调开销 │
│ └── CACHE 值根据并发量设置 │
│ │
│ 4. 监控序列使用 │
│ ├── 避免耗尽 │
│ └── 及时调整 │
│ │
└─────────────────────────────────────────────────────────────┘
6.2 示例 #
sql
-- 推荐: UUID
CREATE TABLE best_practice_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100),
email VARCHAR(100) UNIQUE,
created_at TIMESTAMP DEFAULT NOW()
);
-- 兼容场景: 序列
CREATE SEQUENCE legacy_id_seq CACHE 100;
CREATE TABLE legacy_users (
id BIGINT PRIMARY KEY DEFAULT nextval('legacy_id_seq'),
name VARCHAR(100),
email VARCHAR(100)
);
-- 混合使用: 有序UUID
CREATE TABLE ordered_users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
created_at TIMESTAMP DEFAULT NOW(),
name VARCHAR(100)
);
CREATE INDEX idx_created ON ordered_users(created_at);
七、总结 #
序列要点:
| 特性 | 说明 |
|---|---|
| 创建序列 | CREATE SEQUENCE |
| 获取值 | nextval, currval, setval |
| 表关联 | DEFAULT nextval() |
| SERIAL | 自动创建序列 |
| 替代方案 | UUID, unique_rowid |
下一步,让我们学习临时表!
最后更新:2026-03-27