如果我有一个带有自动递增ID列的表,我希望能够在该表中插入一行,并获取刚刚创建的行的ID。我知道,通常,StackOverflow问题需要某种经过尝试或研究的代码,但是我不确定从Snowflake入手。我已经翻阅了他们的文档,却对此一无所获。
到目前为止,我能做的最好的事情是tryresult_scan()
和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允许html" target="_blank">并发INSERT语句,因此可能会发生以下情况
Q1
和Q2
,做一个简单的单行INSERT
,大约在同一时间开始Q1
开始,有点领先Q2
开始Q1
创建一个行同值1
从IDENTITY
柱Q2
创建一个行同值2
从IDENTITY
柱Q2
领先Q1
- 这是关键部分Q2
提交,被标记为已完成 T2
Q1
提交,被标记为已完成 T1
请注意,此T1
时间晚于T2
。现在,当我们尝试执行操作时SELECT ... AT(statement=>Q1)
,我们将看到状态为as
T1
,包括之前语句的所有更改,因此包括2
from的值Q2
。这不是我们想要的。
解决这个问题的方法可能是向unique identifier
每个INSERT
对象添加一个(例如,来自单独的SEQUENCE对象),然后使用MAX
。
对不起。分布式交易很困难:)
问题内容: 我想将psycopg2用于多行,然后使用单个查询(按顺序)返回所有s。这就是PostgreSQL扩展的目的,并且似乎可以使用正常工作: 现在,为了传递动态生成的数据,似乎是一种方法: 但是,在这种情况下,将产生以下内容: 我如何才能正确返回所有s而不是仅返回一个? 问题答案: 您不应该从以下位置获得结果: 该功能对于更新数据库的命令最有用:查询返回的任何结果集都将被丢弃。 根据psyc
这是我的密码: 如您所知,它会在数据库中插入一个新行。现在我需要获取插入行的。我怎么能得到这个? 注意,我知道,如果我使用
如果我有一个具有自动递增ID列的表,我希望能够在该表中插入一行,并获得我刚刚创建的行的ID。我知道,一般来说,StackOverflow问题需要一些尝试过的代码或研究成果,但我不确定从雪花开始。我翻了他们的文件,什么也没找到。 编辑:为了这里有代码: 我想为我刚刚插入的这一行找到自动递增的。
问题内容: 我想编写一个函数,为插入的行返回一列的值(在这种情况下为自动递增的主键)。 本质上,我想插入一些新数据,生成一个新的主键,然后获取该键。我可以简单地在表中查找最高的主键,但是有可能其他人也可以运行该函数,并且我可以返回错误的键,对吗? 解决这个问题的最简单方法是什么? 问题答案: 正如评论中指出的那样,来自MySQL文档: 该函数不受竞争条件的影响,因为它在特定于您的连接的MySQL中
在下面的代码中,我得到。我读到,也可以直接从获取最后插入的行id。在我的代码中,我把空插入改为长,并尝试了许多其他的东西,就像我在互联网上找到的例子一样,但是每次我都会出错。你想给我提供一个代码/解决方案,从@插入获取行/用户ID吗? 实体 存储库 查看模型 片段/活动
保存课程()应该启动验证导师()来创建和/或验证导师的当前输入信息是否可以添加到课程实体构造器中。mMentorViewModel.save导师(mMentor)应该通过Schuldler存储库,而Schuludler存储库使用数据库中的MentorDAO来插入新的导师。 我读过这个方法Android Room-使用auto generate获取新插入行的id,但是我缺少一些关于如何获取新创建的m