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

Jos*_*ing 4 sql snowflake-cloud-data-platform

如果我有一个带有自动递增 ID 列的表,我希望能够在该表中插入一行,并获取我刚刚创建的行的 ID。我知道一般而言,StackOverflow 问题需要某种已尝试或研究过的代码,但我不确定从 Snowflake 开始。我已经翻阅了他们的文档,但没有发现任何相关内容。

到目前为止我能做的最好的是 try result_scan()and last_query_id(),但这些并没有给我任何关于插入的行的相关信息,只是确认插入了一行。

我相信我所要求的是符合 MS SQL Server 的SCOPE_IDENTITY()功能。

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);
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ski 6

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

原答案

雪花不提供SCOPE_IDENTITY今天的等价物。

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

下面是一个例子:

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        |
----------+
Run Code Online (Sandbox Code Playgroud)

last_query_id()如果您想稍后访问它,您也可以将其保存到变量中,例如

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

注意 - 它通常是正确的,但如果用户例如rid手动插入一个大值,它可能会影响此查询的结果。

更新

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

由于分布式系统中查询的各个阶段的执行顺序Snowflake可能是不确定的,并且 Snowflake 允许并发 INSERT 语句,因此可能会发生以下情况

  • 两个查询,Q1并且Q2,做一个简单的单行INSERT,大致同时开始
  • Q1 开始,有点领先
  • Q2 开始
  • Q1创建一个行同值1IDENTITY
  • Q2创建一个行同值2IDENTITY
  • Q2领先Q1-这是关键部分
  • Q2 提交,标记为完成时间 T2
  • Q1 提交,标记为完成时间 T1

请注意,T1晚于T2. 现在,当我们尝试执行时SELECT ... AT(statement=>Q1),我们将看到状态 as-of T1,包括之前语句的所有更改,因此包括2来自的值Q2。这不是我们想要的。

解决方法可能是向unique identifier每个添加一个INSERT(例如从单独的 SEQUENCE 对象),然后使用MAX.

对不起。分布式事务很难:)

  • @JohnZabroski 它在我们的待办事项列表中,但目前还没有积极的开发。如果这阻碍了您,请通过您的销售/支持渠道提出它,这可能有助于确定其优先级。 (2认同)