ApacheIgnite:如何使用标识键插入表(SQL Server)

ApacheIgnite:如何使用标识键插入表(SQL Server),ignite,Ignite,我在SQL Server中有一个表,其中主键是自动生成的(标识列),即 由于table\u id是一个自动生成的列,因此当我实现SqlFieldQueryINSERT子句时,我没有将任何参数设置为table\u id: sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)"); cache.query(sql.setArgs("str"); 但是,在运行时,我遇到以下错误: 线程“main”javax.c

我在SQL Server中有一个表,其中主键是自动生成的(标识列),即

由于
table\u id
是一个自动生成的列,因此当我实现
SqlFieldQuery
INSERT
子句时,我没有将任何参数设置为
table\u id

sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)");
cache.query(sql.setArgs("str");
但是,在运行时,我遇到以下错误:

线程“main”javax.cache.CacheException:类org.apache.ignite.internal.processors.query.IgniteSQLException:未能执行DML语句[stmt=INSERT-INTO-TableName(某些字段)值(?),params=[“str”]]

位于org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:807)
位于org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:765)

原因:类org.apache.ignite.internal.processors.query.IgniteSQLException:未能执行DML语句[stmt=INSERT INTO TableName(某些_字段)值(?),params=[“str”]]

位于org.apache.ignite.internal.processors.query.h2.igniteh2index.queryDistributedSqlFields(igniteh2index.java:1324)
位于org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:1815) 位于org.apache.ignite.internal.processors.query.GridQueryProcessor$5.applyx(GridQueryProcessor.java:1813) 位于org.apache.ignite.internal.util.lang.IgniteOutClosureX.apply(IgniteOutClosureX.java:36) 位于org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2293) 位于org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:1820) 位于org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:795) ... 还有5个 原因:类org.apache.ignite.IgniteCheckedException:查询中缺少密钥 位于org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.createSupplier(UpdatePlanBuilder.java:331) 位于org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForInsert(UpdatePlanBuilder.java:196) 位于org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForStatement(UpdatePlanBuilder.java:82) 位于org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.getPlanForStatement(DmlStatementsProcessor.java:438) 位于org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFields(DmlStatementsProcessor.java:164) 位于org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updatesqlfieldsddistributed(DmlStatementsProcessor.java:222) 位于org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:1321) ... 还有11个

这就是我计划如何实现插入的原因,因为从缓存、增量和插入中获取max
table_id
似乎更繁琐。我想我可以从insert中省略
表\u id
,让SQL Server插入pk,但它似乎不是这样工作的

您能告诉我这通常应该如何在Ignite中实现吗?我检查了ignite示例,不幸的是,这些示例太简单了(即仅限固定键,如1或2)

此外,Ignite如何支持序列的使用


我使用的是ignite core 2.2.0。感谢您的帮助!谢谢。

Ignite还不支持标识列[1]

它可能不是obviuos,但Ignite SQL层构建在键值存储之上,可以由其他CacheStore支持。您的SQL查询永远不会按原样进入CacheStore

Ignite Internal将执行您的查询,将数据保存在缓存中,然后更新将传播到CacheStore,CacheStore将为您的SQL server创建新的SQL查询

因此,Ignite需要在数据保存到缓存中之前知道标识列值(实际上是一个键)


[1]

没错,目前不支持自动增量字段。

作为一种选择,您可以通过手动生成ID,例如。

我不确定这是否完全可行,但您也可以使用UUID作为主键。您可能希望使用类似于有序/顺序的方法来降低将UUID用作PK对性能的影响:
sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)");
cache.query(sql.setArgs("str");