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我刚刚插入的这一行进行自动增量。
注意:在一些非常罕见的情况下,下面的答案可能不是 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创建一个行同值1从IDENTITY柱Q2创建一个行同值2从IDENTITY柱Q2领先Q1-这是关键部分Q2 提交,标记为完成时间 T2Q1 提交,标记为完成时间 T1请注意,T1晚于T2. 现在,当我们尝试执行时SELECT ... AT(statement=>Q1),我们将看到状态 as-of T1,包括之前语句的所有更改,因此包括2来自的值Q2。这不是我们想要的。
解决方法可能是向unique identifier每个添加一个INSERT(例如从单独的 SEQUENCE 对象),然后使用MAX.
对不起。分布式事务很难:)