返回工具站
Snowflake

Snowflake 数列生成器

Snowflake 序列是数据库对象,而非 ETL 转换。当数仓应拥有生成 ID 时很有用。

使用时机
  • 当键生成属于数据库层时,使用 `CREATE SEQUENCE`。
  • 新行需要唯一数字 ID 时,在插入、合并或默认表达式中调用 `NEXTVAL`。
  • 每个键域使用一个序列,ID 区间更易管理。
重要语法
语法用途示例
CREATE SEQUENCE定义序列对象。CREATE SEQUENCE customer_seq START = 1 INCREMENT = 1;
NEXTVAL推进并返回下一个值。customer_seq.NEXTVAL
ALTER SEQUENCE之后调整行为。ALTER SEQUENCE customer_seq SET INCREMENT = 10;
数仓自有键流程
  1. 1在拥有目标表的 schema 中创建序列对象。
  2. 2在插入或合并语句中引用 `sequence_name.NEXTVAL`。
  3. 3验证下游 ETL 不会同时生成竞争键。
  4. 4记录序列归属,使加载与 DDL 保持一致。
代码

创建并使用序列

CREATE OR REPLACE SEQUENCE customer_seq START = 1 INCREMENT = 1;

INSERT INTO dim_customer (customer_key, customer_name)
SELECT customer_seq.NEXTVAL, customer_name
FROM stg_customer;
常见问题

序列值为什么有空洞?

空洞是正常的。唯一性比完美连续编号更重要。

ETL 与 Snowflake 都应该生成键吗?

不应该。为代理键生命周期选择一个归属方,否则模型会漂移。

可以把 Snowflake 序列作为主键默认值吗?

可以。将序列 NEXTVAL 设为列默认值:`ALTER TABLE t ALTER COLUMN id SET DEFAULT seq.NEXTVAL`。这样所有插入操作的键生成都移到数据库层。

截断目标表后如何重置序列?

使用 `ALTER SEQUENCE seq_name SET VALUE = 0` 重置为初始值。下一次 NEXTVAL 返回 START 值(若 SET VALUE 高于它,则返回 START + INCREMENT)。

相关链接