使用带有自动增量列的jdbc进行雪花插入数据的问题

问题描述 投票:0回答:2

我正在尝试使用jdbc将数据插入表中的数据,该表中的雪花来自另一个表中的雪花。我跳过了自动递增列,仅从以下查询中插入所需的列]

// both tables ddl
CREATE or replace myTargetTable(col1 number(38,0) not null autoincrement,col2 text,constraint conname primary key (col1));
// insert
insert into myTargetTable (COL2) select COL2 from mySrcTable;

它以正确的自动增量顺序正确地插入了数据,但是如果我插入另一个值,则自动增量值将在其值中随机增加

insert into myTargetTable (COL2) values ('randomVal');

它反映了这个问题,

Row        Col1      Col2
1,374       1374        sd
1,375       1375        sd
1,376       1376        sd
1,377       1793        randomVal       - manuel insert to see sequence value

Col1 is auto incr

此问题附带260条记录+。这是自动递增键的问题,请帮忙。谢谢!

PS。如果col1不是主键,并且在雪花控制台上执行查询,也会出现此问题。

java jdbc snowflake-cloud-data-platform
2个回答
1
投票

雪花AUTOINCREMENT使用序列,正如您从文档中看到的那样,数字可以并且确实会“跳过”。

不保证序列中的值是连续的(无间隙),也不保证序列值是以特定顺序分配的。实际上,除了使用单行语句外,没有其他方法可以按照指定的顺序将序列中的值分配给行(这仍然无法保证间隔)。

https://docs.snowflake.com/en/user-guide/querying-sequences.html


0
投票

Snowflake利用序列来生成标识列的值:

https://docs.snowflake.com/en/sql-reference/sql/create-table.html#optional-parameters

而且Snowflake不能保证生成没有间隔的序列号:

https://docs.snowflake.com/en/user-guide/querying-sequences.html

如果手动为列创建序列,则可以观察到相同的行为:

create or replace sequence seq1;

CREATE or replace table myTargetTable(col1 number(38,0) not null 
default seq1.nextval,col2 text,constraint conname primary key (col1));

这里的主要问题是,当您开始在批处理插入中使用“序列值”时,Snowflake会对其进行缓存。因此,它不是一次获取一个值,而是要求值的范围(256、512、1024等...)。因此,如果插入更多的行,您会发现差距会更大。无法将这些值释放回序列,因此这就是为什么您会看到如此巨大的差距。

© www.soinside.com 2019 - 2024. All rights reserved.