代码之家  ›  专栏  ›  技术社区  ›  Joshua Schlichting

获取雪花数据仓库中插入的行的标识

  •  3
  • Joshua Schlichting  · 技术社区  · 6 年前

    如果我有一个具有自动递增ID列的表,我希望能够在该表中插入一行,并获取刚刚创建的行的ID。我知道,通常情况下,StackOverflow问题需要某种尝试或研究工作的代码,但我不确定从Snowflake开始。我已经翻遍了他们的书 documentation 我没有发现任何关于这个的东西。

    到目前为止,我能做的最好的事情就是尝试 result_scan() last_query_id()

    我相信我的要求与MS SQL Server的要求是一致的 SCOPE_IDENTITY() 作用

    范围_标识() ?

    编辑:为了在此处包含代码:

    CREATE TABLE my_db..my_table
    (
        ROWID INT IDENTITY(1,1),
        some_number INT,
        a_time TIMESTAMP_LTZ(9),
        b_time TIMESTAMP_LTZ(9),
        more_data VARCHAR(10)
    );
    INSERT INTO my_db..my_table
    (
        some_number,
        a_time,
        more_data
    )
    VALUES
    (1, my_time_value, some_data);
    

    我想进入自动增量 ROWID 对于这一行,我刚刚插入。

    1 回复  |  直到 6 年前
        1
  •  6
  •   Vijay Kumbhoje    5 年前

    注意:在一些非常罕见的情况下,下面的答案可能不是100%正确,请参阅下面的更新部分

    原始答案

    雪花不能提供相当于 SCOPE_IDENTITY 今天

    但是,您可以利用Snowflake的 time travel 在执行给定语句后立即检索列的最大值。

    下面是一个例子:

    create or replace table x(rid int identity, num int);
    insert into x(num) values(7);
    insert into x(num) values(9);
    -- you can insert rows in a separate transaction now to test it
    select max(rid) from x AT(statement=>last_query_id());
    ----------+
     MAX(RID) |
    ----------+
     2        |
    ----------+
    

    last_query_id()

    insert into x(num) values(5);
    set qid = last_query_id();
    ...
    select max(rid) from x AT(statement=>$qid);
    

    注意-通常是正确的,但如果用户(例如)在 rid

    注意,我意识到上面的代码很少会生成错误的答案。

    Snowflake 可以是非确定性的,并且Snowflake允许并发INSERT语句,可能会发生以下情况

    • 两个问题,, Q1 Q2 INSERT ,大致在同一时间开始
    • 开始,有点超前
    • 问题2
    • Q1 创建具有值的行 1 IDENTITY
    • 创建具有值的行 2
    • 领先 Q1 - 这是关键部分
    • 提交,在时间标记为已完成 T2
    • Q1 提交,在时间标记为已完成 T1

    T1 迟于 T2 . 现在,当我们尝试 SELECT ... AT(statement=>Q1) ,我们将看到截至的状态 T1 ,包括之前语句的所有更改,因此包括值 2. 从…起 问题2 . 这不是我们想要的。

    解决这个问题的方法可以是添加一个 unique identifier 插入 (例如,从一个单独的序列对象),然后使用 MAX .

    很抱歉分布式事务很难实现:)

    推荐文章