要使用此功能,你需要拥有 drizzle-orm@0.32.0
或更高版本以及 drizzle-kit@0.23.0
或更高版本
序列
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");