当前位置: 首页 > 面试题库 >

获取在Snowflake Datawarehouse中插入的行的标识

鲁旭
2023-03-14
问题内容

如果我有一个带有自动递增ID列的表,我希望能够在该表中插入一行,并获取刚刚创建的行的ID。我知道,通常,StackOverflow问题需要某种经过尝试或研究的代码,但是我不确定从Snowflake入手。我已经翻阅了他们的文档,却对此一无所获。

到目前为止,我能做的最好的事情是tryresult_scan()last_query_id(),但是这些操作并没有为我提供有关所插入行的任何相关信息,只是向我确认已插入行。

我相信我要的是与MS SQL Server的SCOPE_IDENTITY()功能相似的功能。

是否有适用于MS SQL Server的Snowflake等效功能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我刚刚插入的这一行添加自动增量。


问题答案:

注意:在某些非常罕见的情况下,下面的答案可能不是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        |
----------+

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允许html" target="_blank">并发INSERT语句,因此可能会发生以下情况

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

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

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

对不起。分布式交易很困难:)



 类似资料:
  • 问题内容: 我想将psycopg2用于多行,然后使用单个查询(按顺序)返回所有s。这就是PostgreSQL扩展的目的,并且似乎可以使用正常工作: 现在,为了传递动态生成的数据,似乎是一种方法: 但是,在这种情况下,将产生以下内容: 我如何才能正确返回所有s而不是仅返回一个? 问题答案: 您不应该从以下位置获得结果: 该功能对于更新数据库的命令最有用:查询返回的任何结果集都将被丢弃。 根据psyc

  • 这是我的密码: 如您所知,它会在数据库中插入一个新行。现在我需要获取插入行的。我怎么能得到这个? 注意,我知道,如果我使用

  • 如果我有一个具有自动递增ID列的表,我希望能够在该表中插入一行,并获得我刚刚创建的行的ID。我知道,一般来说,StackOverflow问题需要一些尝试过的代码或研究成果,但我不确定从雪花开始。我翻了他们的文件,什么也没找到。 编辑:为了这里有代码: 我想为我刚刚插入的这一行找到自动递增的。

  • 问题内容: 我想编写一个函数,为插入的行返回一列的值(在这种情况下为自动递增的主键)。 本质上,我想插入一些新数据,生成一个新的主键,然后获取该键。我可以简单地在表中查找最高的主键,但是有可能其他人也可以运行该函数,并且我可以返回错误的键,对吗? 解决这个问题的最简单方法是什么? 问题答案: 正如评论中指出的那样,来自MySQL文档: 该函数不受竞争条件的影响,因为它在特定于您的连接的MySQL中

  • 在下面的代码中,我得到。我读到,也可以直接从获取最后插入的行id。在我的代码中,我把空插入改为长,并尝试了许多其他的东西,就像我在互联网上找到的例子一样,但是每次我都会出错。你想给我提供一个代码/解决方案,从@插入获取行/用户ID吗? 实体 存储库 查看模型 片段/活动

  • 保存课程()应该启动验证导师()来创建和/或验证导师的当前输入信息是否可以添加到课程实体构造器中。mMentorViewModel.save导师(mMentor)应该通过Schuldler存储库,而Schuludler存储库使用数据库中的MentorDAO来插入新的导师。 我读过这个方法Android Room-使用auto generate获取新插入行的id,但是我缺少一些关于如何获取新创建的m