Apache Ignite:如何使用 IDENTITY 键插入表(SQL Server)

aol*_*aol 2 ignite

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

CREATE TABLE TableName 
(
     table_id INT NOT NULL IDENTITY (1,1),
     some_field VARCHAR(20),

     PRIMARY KEY (table_id)
);
Run Code Online (Sandbox Code Playgroud)

由于table_id是自动生成的列,因此当我实现该SqlFieldQuery INSERT子句时,我没有将任何参数设置为table_id

sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)");
cache.query(sql.setArgs("str");
Run Code Online (Sandbox Code Playgroud)

但是在运行时我收到以下错误:

线程“main”中的异常 javax.cache.CacheException: class org.apache.ignite.internal.processors.query.IgniteSQLException: 无法执行 DML 语句 [stmt=INSERT INTO TableName (some_field) VALUES (?), params=[" str"]]

在 org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:807)
在 org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:765)
...
引起作者:class org.apache.ignite.internal.processors.query.IgniteSQLException:无法执行 DML 语句 [stmt=INSERT INTO TableName (some_field) VALUES (?), params=["str"]]

在 org.apache.ignite.internal.processors.query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.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) at org.apache.ignite.internal.processors.query.h2.dml.UpdatePlanBuilder.planForInsert(UpdatePlanBuilder.java:196) at 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) at org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFieldsDistributed(DmlStatementsProcessor.java:222) at org.apache.ignite.internal.processors。 query.h2.IgniteH2Indexing.queryDistributedSqlFields(IgniteH2Indexing.java:第1321章 ……还有11个

这就是我计划实现插入的方式,因为table_id从缓存、增量和插入中获取最大值似乎更乏味。我以为我可以table_id从插入中省略并让 SQL Server 插入 pk,但它似乎不是这样工作的。

你能告诉我这通常应该如何在 Ignite 中实现吗?我检查了 ignite-examples,不幸的是这些例子太简单了(即只有固定键,比如 1 或 2)。

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

我正在使用 ignite-core 2.2.0。任何帮助表示赞赏!谢谢你。

小智 5

Ignite 尚不支持标识列 [1]。

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

Ignite 内部将执行您的查询,将数据保存在缓存中,然后更新才会传播到 CacheStore,这将为您的 SQL 服务器创建一个新的 SQL 查询。

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

[1] https://issues.apache.org/jira/browse/IGNITE-5625


小智 5

确实,目前不支持自动增量字段。
作为一种选择,您可以通过例如Ignite 的 ID 生成器手动生成 ID 。