sql - 获取插入到雪花数据仓库中的行的标识
问题描述
如果我有一个带有自动递增 ID 列的表,我希望能够在该表中插入一行,并获取我刚刚创建的行的 ID。我知道,一般而言,StackOverflow 问题需要某种尝试或研究工作的代码,但我不确定从 Snowflake 开始的地方。我已经翻阅了他们的文档,但对此一无所获。
到目前为止,我能做的最好的事情是 try result_scan()
and 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 允许并发 INSERT 语句,因此可能会发生以下情况
- 两个查询,
Q1
和Q2
,做一个简单的单行INSERT
,大致同时开始 Q1
开始,有点超前Q2
开始Q1
1
使用IDENTITY
列中的值创建一行Q2
2
使用IDENTITY
列中的值创建一行Q2
领先Q1
-这是关键部分Q2
提交,在时间被标记为完成T2
Q1
提交,在时间被标记为完成T1
请注意,T1
晚于T2
. 现在,当我们尝试 do 时SELECT ... AT(statement=>Q1)
,我们将看到 as-of 的状态T1
,包括之前语句的所有更改,因此包括2
来自的值Q2
。这不是我们想要的。
解决方法可能是unique identifier
给每个添加一个INSERT
(例如从一个单独的 SEQUENCE 对象),然后使用一个MAX
.
对不起。分布式事务很难:)
推荐阅读
- r - addEventListener 以闪亮的谷歌地图自动关闭信息窗口
- presto - 我可以在不指定 --server 或 --catalog 的情况下执行 presto CLI
- json - 将包含对象数组的 json 传递给 PostgreSQL 函数会引发格式错误的数组文字。意外的数组元素
- ios - 在 React Native 中,有没有办法识别手写笔(笔)与触摸(手指)事件?
- javascript - 将 2 个或多个 JS 文件编译成 1 个
- android - 无法为首先位于屏幕外部的按钮设置点击监听器(然后在内部设置动画)
- html - 显示:flex 在 CSS 中不起作用
- xml - 使用 xmllint 和 xpath 在地理服务器 SLD 文件中提取属性版本的值
- listview - Xamarin ListView 空间问题,当两个 listview 放入 ScrollView。需要一个解决方案。
- mysql - MySQL,连接中限制一张表