首页 > 解决方案 > 从 Snowflake 中的序列创建具有默认 nextVal 的表

问题描述

我目前正在尝试将 postgres 查询转换为与 Snowflake 兼容并以相同的方式工作。

Postgres 

CREATE SEQUENCE IF NOT EXISTS public.etl_jobs_delta_loading_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE TABLE IF NOT EXISTS public.etl_jobs_delta_loading
(
    id INTEGER DEFAULT nextval('public.etl_jobs_delta_loading_id_seq'::regclass) NOT NULL,
    job_name VARCHAR(500) NOT NULL,
    loaded_until TIMESTAMP,
    etl_execution_time TIMESTAMP,
    execution_status VARCHAR(30)
);

我将序列翻译为雪花,但在尝试获取雪花中的 nextVal 时不断出错。

Snowflake

CREATE OR REPLACE SEQUENCE etl_jobs_delta_loading_id_seq
    START = 1
    INCREMENT = 1

CREATE TABLE IF NOT EXISTS public.etl_jobs_delta_loading
(
    id INTEGER DEFAULT nextval('public.etl_jobs_delta_loading_id_seq'::regclass) NOT NULL, -- statement that needs to be converted
    job_name VARCHAR(500) NOT NULL,
    loaded_until TIMESTAMP,
    etl_execution_time TIMESTAMP,
    execution_status VARCHAR(30)
);

我尝试了各种方法来创建 etl_jobs_delta_loading 表,但到目前为止还没有运气。关于如何在雪花中实现这一点的任何想法?

标签: postgresqlsnowflake-cloud-data-platformsnowflake-schema

解决方案


从序列中获取值的正确语法是<seq_name>.NEXTVAL

CREATE OR REPLACE SEQUENCE PUBLIC.etl_jobs_delta_loading_id_seq
    START = 1
    INCREMENT = 1;

CREATE TABLE IF NOT EXISTS public.etl_jobs_delta_loading
(
    id INTEGER DEFAULT public.etl_jobs_delta_loading_id_seq.NEXTVAL NOT NULL, 
    job_name VARCHAR(500) NOT NULL,
    loaded_until TIMESTAMP,
    etl_execution_time TIMESTAMP,
    execution_status VARCHAR(30)
);

相关:作为表达式的序列


或者使用 IDENTITY/AUTOINCREMENT 属性:

CREATE OR REPLACE TABLE public.etl_jobs_delta_loading
(
    id INTEGER NOT NULL IDENTITY(1,1), 
    job_name VARCHAR(500) NOT NULL,
    loaded_until TIMESTAMP,
    etl_execution_time TIMESTAMP,
    execution_status VARCHAR(30)
);

推荐阅读