snowflake

Snowflake 风格 64 位 ID 生成与序列工具

概览

扩展包名版本分类许可证语言
snowflake2.4FUNCPostgreSQLC
ID扩展名BinLibLoadCreateTrustReloc模式
4590snowflakesnowflake
相关扩展spock lolor

works on pgedge kernel fork. Set snowflake.node (1..1023) before using snowflake.nextval().

版本

类型仓库版本PG 大版本包名依赖
EXTPIGSTY2.41817161514snowflake-
RPMPIGSTY2.41817161514snowflake_$vpgedge_$v
DEBPIGSTY2.41817161514pgedge-$v-snowflakepgedge-$v
OS / PGPG18PG17PG16PG15PG14
el8.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el8.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el9.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el9.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
el10.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d12.aarch64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.x86_64PIGSTY MISSPIGSTY MISSPIGSTY MISSPIGSTY MISS
d13.aarch64PIGSTY MISS
PIGSTY 2.4
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.x86_64PIGSTY MISS
PIGSTY 2.4
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u22.aarch64PIGSTY MISS
PIGSTY 2.4
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u24.x86_64PIGSTY MISS
PIGSTY 2.4
PIGSTY MISSPIGSTY MISSPIGSTY MISS
u24.aarch64PIGSTY MISS
PIGSTY 2.4
PIGSTY MISSPIGSTY MISSPIGSTY MISS

构建

您可以使用 pig build 命令构建 snowflake 扩展的 RPM / DEB 包:

pig build pkg snowflake         # 构建 RPM / DEB 包

安装

您可以直接安装 snowflake 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install snowflake;          # 当前活跃 PG 版本安装
pig ext install -y snowflake -v 17  # PG 17
dnf install -y snowflake_17       # PG 17
apt install -y pgedge-17-snowflake   # PG 17

创建扩展

CREATE EXTENSION snowflake;

用法

snowflake: PostgreSQL 的 Snowflake ID 序列

提供基于 int8sequence 的唯一 ID 生成,使用 Snowflake 格式,适用于分布式系统。

CREATE EXTENSION snowflake;

配置

postgresql.conf 中设置节点标识符(必需,值为 1-1023):

snowflake.node = 1

函数

函数描述
snowflake.nextval([sequence regclass])生成下一个 Snowflake ID(未指定序列时使用内部序列)
snowflake.currval([sequence regclass])返回序列的当前值
snowflake.get_epoch(snowflake int8)提取时间戳(自 2023-01-01 起的秒数)
snowflake.get_count(snowflake int8)提取计数部分(每毫秒重置)
snowflake.get_node(snowflake int8)提取节点标识符
snowflake.format(snowflake int8)返回包含 nodetscount 字段的 JSONB

示例

-- 生成一个 Snowflake ID
SELECT snowflake.nextval();
-- 136169504773242881

-- 配合命名序列使用
CREATE SEQUENCE orders_id_seq;
SELECT snowflake.nextval('orders_id_seq'::regclass);

-- 提取各组成部分
SELECT snowflake.get_epoch(136169504773242881);
-- 1704996539.845

SELECT to_timestamp(snowflake.get_epoch(136169504773242881));
-- 2024-01-11 13:08:59.845-05

SELECT snowflake.get_node(136169504773242881);
-- 1

SELECT snowflake.format(136169504773242881);
-- {"id": 1, "ts": "2024-01-11 13:08:59.845-05", "count": 0}

-- 用作默认列值
CREATE TABLE orders (
  id int8 DEFAULT snowflake.nextval() PRIMARY KEY,
  data text
);

最后修改 2026-03-14: update extension metadata (953cbd0)