Apache Ignite:如何使用Identity密钥(SQL Server)插入表中



我在SQL Server中有一个表,其中主键是自动化的(身份列),即

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

由于 table_id是自动化列,当我实现 SqlFieldQuery INSERT条款时,我没有将任何参数设置为 table_id

sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)");
cache.query(sql.setArgs("str");

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

线程" main" javax.cache.cacheexception中的异常:class org.apache.ignite.internal.processors.query.ignitesqlexception:无法执行dml语句[stml catest [stmt = insert = insert in tablEname in tablEname(some_field)value(?),参数(?),参数(?)= [" str"]]

at org.apache.ignite.internal.processors.cache.ignitecacheproxy.query(ignitecacheproxy.java:807)
at org.apache.ignite.internal.processors.cache.ignitecacheproxy.query(ignitecacheproxy.java:765)
...
引起:class org.apache.ignite.internal.processors.query.ignitesqlexception:无法执行dml语句[stmt = insert intake intailame = tableName(some_field)value(?),params = [" str"]]

>

at org.apache.ignite.internal.processors.query.h2.igniteh2Indexing.queryDistributedsqlfields(igniteh2indexing.java:1324)
at org.apache.ignite.internal.processors.query.gridqueryprocessor $ 5.Applyx(gridqueryprocessor.java:1815) at org.apache.ignite.internal.processors.query.gridqueryprocessor $ 5.Applyx(gridqueryprocessor.java:1813) atrg.apache.ignite.internal.util.lang.igniteoutclosurex.apply(igniteOutClosurex.java:36) at org.apache.ignite.internal.processors.query.gridqueryprocessor.executequery(gridqueryprocessor.java:2293) at org.apache.ignite.internal.processors.query.gridqueryprocessor.querysqlfields(gridqueryProcessor.java:1820) atrg.apache.ignite.internal.processors.cache.ignitecacheproxy.query(ignitecacheproxy.java:795) ... 5 引起:class org.apache.ignite.ignitecheckedexception:QUER中缺少键 atrg.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) at org.apache.ignite.internal.processors.query.h2.dmlstatementProcessor.getPlanForStatement(dmlstatementProcessor.java:438) at org.apache.ignite.internal.processors.query.h2.dmlstatementprocessor.updatesqlfields(dmlstatementProcessor.java:164) at org.apache.ignite.internal.processors.query.h2.dmlstatementprocessor.updatesqlfieldsdistribed(dmlstatementProcessor.java:222) at org.apache.ignite.internal.processors.query.h2.igniteh2indexing.queryDistributedsqlfields(igniteh2indexing.java:1321) ...更多

这就是我计划实现插入的方式,因为从缓存,增量和插入中获得最大table_id似乎更加乏味。我以为我可以从插入物中省略table_id,并让SQL Server插入PK,但似乎无法正常工作。

您能告诉我通常应该如何在IGNITE中实现这一点吗?我检查了点火示例,不幸的是示例太简单了(即仅修复了键,例如1或2)。

此外,点火如何支持序列的使用?

我正在使用Ignite-Core 2.2.0。任何帮助都将受到赞赏!谢谢。

的确,现在不支持自动启动字段。
作为选项,您可以通过IGNITE的ID Generator手动生成ID。

ignite不支持身份列[1]。

它可能是非obviuos,但是IGNITE SQL层建立在钥匙值存储的顶部,可以由其他cachestore支持。您的SQL查询永远不会像以前那样进入cachestore。

IGNITE内部内容将执行您的查询,将数据保存在缓存中,然后更新将传播到Cachestore,该Cachestore将为您的SQL Server创建新的SQL查询。

因此,IGNITE需要身份列值(实际上是一个键),请在保存在缓存中的数据之前已知。

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

相关内容

最新更新