雪花无法提供@H_502_5@SCOPE_IDENTITY今天的效果。
但是,您可以在执行给定语句后立即利用SNowflake的时间旅行来检索列的最大值。
这是一个例子:
@H_502_5@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 | ----------+
@H_502_5@last_query_id()如果您以后想访问它,也可以将其保存到变量中,例如
@H_502_5@insert into x(num) values(5); set qid = last_query_id(); ... select max(rid) from x AT(statement=>$qid);
注意-通常这是正确的,但是如果用户(例如)@H_502_5@rid手动将较大的值插入其中,则可能会影响此查询的结果。
由于类似的分布式系统中查询的各个阶段的执行顺序@H_502_5@SNowflake可能是不确定的,并且SNowflake允许并发INSERT语句,因此可能会发生以下情况
请注意,此@H_502_5@T1时间晚于@H_502_5@T2。现在,当我们尝试执行操作时@H_502_5@SELECT ... AT(statement=>Q1),我们将看到状态为as@H_502_5@T1,包括之前语句的所有更改,因此包括@H_502_5@2from的值@H_502_5@Q2。这不是我们想要的。
解决这个问题的方法可能是向@H_502_5@unique identifier每个@H_502_5@INSERT对象添加一个(例如,来自单独的SEQUENCE对象),然后使用@H_502_5@MAX。
对不起。分布式交易很困难:)