当前位置: 首页 > 知识库问答 >
问题:

使用带有自动增量列的jdbc插入雪花数据时出现问题

谭飞掣
2023-03-14

我正在尝试使用jdbc将数据插入另一个表中的一个表,该表的snowflake中有自动递增列。我跳过了auto increment列,并从下面的查询中只插入了必需的列

// 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张唱片。这是自动递增键的问题,请帮助。谢谢

另外,如果col1不是主键,并且在snowflake控制台上执行查询,也会出现这个问题。

共有2个答案

赵禄
2023-03-14

雪花自动增值使用序列,正如你从留档中看到的,数字可以而且确实被“跳过”。

无法保证序列中的值是连续的(没有间隙),或者序列值是按特定顺序分配的。事实上,除了使用单行语句之外,没有办法按指定顺序将值从序列分配到行(这仍然不能保证间隙)。

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

裴育
2023-03-14

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));

这里的主要问题是,当您开始在批插入中使用“序列值”时,雪花缓存它们。因此,它不是一次获取一个值,而是请求一系列值(256、512、1024等等)因此,如果插入更多行,您将看到间距会更大。没有办法将这些值释放回序列,所以这就是为什么你会看到这个巨大的差距。

 类似资料:
  • 我正在使用java中的MySQL库执行一个查询。在我的数据库结构中,有一列名为(主键,非空且自动递增)。通常在每次插入查询中,我都将值设置为,在查询执行后,它会增加最后一个id,但在java中这样做会给我异常。 这就是代码: 如何使用自动增量ID执行查询?

  • 本文向大家介绍如何使用JDBC将数据插入具有自动递增列的表中?,包括了如何使用JDBC将数据插入具有自动递增列的表中?的使用技巧和注意事项,需要的朋友参考一下 在将数据插入具有自动递增列的表中时,只需保留该特定列,并使用INSERT语句的以下语法指定其余列即可插入剩余值- 示例 让我们使用CREATE语句在MySQL数据库中创建一个名称为sales的表,其中一列自动递增,如下所示- 以下JDBC程

  • 我有一个pyspark dataframe有5列,我需要写到雪花表有6列,5列与dataframe列相同,但雪花表中有一个额外的自动增量列。 当我试图将此数据frame写入雪花表,但它给出了一个错误;由于dataframe和Snowflake表中的列数不同,导致列不匹配。我已经尝试了mode='append',但这不起作用。 我希望dataframe中的这5列应该被插入到雪花表中,并且第6个自动递

  • 但会导致以下错误消息: 行2,列1(id)的大容量加载数据转换错误(类型不匹配或指定代码格式的字符无效)。

  • 问题内容: 我正在尝试更改没有主键或auto_increment列的表。我知道如何添加主键列,但我想知道是否有可能自动将数据插入主键列(我已经在数据库中有500行,并希望为其提供ID,但我不想手动执行) 。有什么想法吗?非常感谢。 问题答案: 在我的测试中,添加列的语句可以正常工作: 在为测试目的而创建的临时表上,以上语句创建了该 列,并为该表中的每个现有行插入了自动递增值,从1开始。

  • 问题内容: 我正在寻找这样的查询: id | int | 自动增量 varchar | 255 这样桌子就看起来像 1 | val1 2 | val2 3 | val3 … 除了id总是以每一行都结束而已。 我怎样才能做到这一点? 问题答案: