当前位置: 首页 > 知识库问答 >
问题:

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

长孙阳成
2023-03-14

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

编辑:为了这里有代码:

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个答案

谈萧迟
2023-03-14

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

Snowflake现在没有提供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        |
----------+
insert into x(num) values(5);
set qid = last_query_id();
...
select max(rid) from x AT(statement=>$qid);

注意,我意识到上面的代码很少会产生不正确的答案。

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

  • 两个查询,Q1Q2,执行简单的单行插入,大致同时开始
  • Q1开始,有点超前
  • Q2开始
  • Q1Identity
  • 创建值 1的行
  • Q2标识
  • 创建值为 2的行
  • Q2领先于Q1-这是关键部分
  • Q2提交,在T2
  • 时标记为完成
  • Q1提交,在T1
  • 时标记为完成

方法可以是向每个insert添加唯一标识符(例如,从一个单独的序列对象),然后使用max

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

 类似资料:
  • 我正在使用雪花,我正在寻找插入数据到一个表,而使用一个变量,使用变量的目的是,当我可以改变它,而不做查找和替换所有 以下作品 以下操作不起作用 然而,这是有效的。 https://docs.snowflake.com/en/sql-reference/session-variables.html

  • 我的雪花实例上有一个数据库。数据库有两个模式和。 模式使用SQLAlchemy- 我有一个列的dataframe,如下所述,需要插入到上面创建的表中- 因此,为了插入数据帧,我使用了方法,如下所示- 数据帧。to_sql(table_name,self.engine,index=False,method=pd_writer,if_exists=“append”) 这会给我一个错误- 这个错误是因为

  • 我已经看到了一些关于数据库到雪花的问题,但我的问题是如何将表格从雪花到数据库。 到目前为止我所做的:创建了一个集群并将集群附加到我的笔记本上(我正在使用Python) 然后我试着用spark.read读取雪花中的FBK _视频表: 我也尝试过:选项(“dbtable”,“从FBK_VIDEOS中选择*”).load() 但我看到的以下错误: net.snowflake.client.jdbc.Sn

  • 问题内容: 如果我有一个带有自动递增ID列的表,我希望能够在该表中插入一行,并获取刚刚创建的行的ID。我知道,通常,StackOverflow问题需要某种经过尝试或研究的代码,但是我不确定从Snowflake入手。我已经翻阅了他们的文档,却对此一无所获。 到目前为止,我能做的最好的事情是try和,但是这些操作并没有为我提供有关所插入行的任何相关信息,只是向我确认已插入行。 我相信我要的是与MS S

  • 我对雪花是新手,但我的公司一直在成功地使用它。 目前正在使用Java parquet-avro V1.10.1使用现有的Avro模式编写Parquet文件。 我已经削减了Avro模式,并发现Avro模式中存在一个MAP类型是导致这个问题的原因。 田地是 使用Parquet-Tools的Parquet模式示例。 感谢任何协助

  • 我在Snowflake中有一个名为“年龄”的大列,5%的行具有“>80”之类的值。 null