postgresql - 从 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 表,但到目前为止还没有运气。关于如何在雪花中实现这一点的任何想法?
解决方案
从序列中获取值的正确语法是<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)
);
推荐阅读
- angular - ListView 不会一次呈现所有项目
- sql - 使用连接 SQL 更新表的所有行
- twig - 在 Twig 中创建具有变量 Key 的对象
- php - Laravel - 从另一个模型获取模型属性
- c# - MongoDB c#使用定义生成器检索文档内数组中的所有匹配元素
- python - 遵循约定重写代码的困难
- javascript - 类型 'void' 必须有一个返回迭代器的 '[Symbol.iterator]()' 方法
- rdf - 个人创建的耶拿在写入文件时没有类
- ios - Swift - 4 - 无法将“__NSCFNumber”(0x10cfb1840)类型的值转换为“NSString”(0x10c0824a8)
- odoo-10 - XMLRPC 搜索 product.template 返回空列表