注意:在一些非常罕见的情况下,下面的答案可能不是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
.
很抱歉分布式事务很难实现:)