要使用此功能,您需要 `[email protected]` 或更高版本以及 `[email protected]` 或更高版本。
序列
PostgreSQL
SQLite
MySQL
SingleStore
PostgreSQL 中的序列是特殊的单行表,用于生成唯一标识符,通常用于自动递增的主键值。它们提供了一种线程安全的方式,可在多个会话中生成唯一的序列值。
主要特点
-
创建和初始化:使用 CREATE SEQUENCE 创建新序列。可以指定增量值、起始值、最小/最大值和缓存大小等参数。
-
操作函数
nextval('sequence_name')
:推进序列并返回下一个值。currval('sequence_name')
:返回当前会话中序列的当前值。setval('sequence_name', value)
:设置序列的当前值。lastval()
:返回当前会话中由 nextval 返回的最后一个值。
-
所有权:序列可以使用 OWNED BY 子句链接到表列。删除表或列将自动删除关联的序列。
-
循环:序列可以使用 CYCLE 选项在达到最大值或最小值时循环。默认值为 NO CYCLE。
-
缓存:序列值可以使用 CACHE 选项预分配以提高性能。
限制
- 间隙:序列不是无间隙的。中止的事务或崩溃可能导致序列值中出现间隙。
- 并发性:虽然序列在不同会话中提供唯一值,但考虑所有会话时,这些值可能不是按顺序的。
- 不可回滚:如果事务失败,对序列的更改不会回滚。这确保了唯一值,但可能导致间隙。
- 崩溃恢复:未日志记录的序列或在崩溃前修改的序列可能无法正确恢复到其先前状态。
实际应用
- 默认行为:默认情况下,序列按 1 递增并从 1 开始。
- 自定义行为:可以指定自定义起始点、增量、最小/最大值和循环。
- 关联:通常与表列关联以实现自增字段,从而使唯一标识符的管理无缝进行。
使用示例
import { pgSchema, pgSequence } from "drizzle-orm/pg-core";
// No params specified
export const customSequence = pgSequence("name");
// Sequence with params
export const customSequence = pgSequence("name", {
startWith: 100,
maxValue: 10000,
minValue: 100,
cycle: true,
cache: 10,
increment: 2
});
// Sequence in custom schema
export const customSchema = pgSchema('custom_schema');
export const customSequence = customSchema.sequence("name");