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

时间:2017-12-01 02:00:40

标签: ignite

我在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语句[stmt = INSERT INTO TableName(some_field)VALUES(?),params = [" str&#34 ;]]

     

at 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"]]

     

at 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)           at org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:1820)           在org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:795)           ......还有5个       引起:class 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)           at 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个

这就是我计划实现插入的方式,因为从缓存中获取max table_id似乎更加繁琐,增量和插入。我以为我可以省略插入中的table_id并让SQL Server插入pk,但它似乎不会像这样工作。

您能否告诉我这通常应该如何在Ignite中实施?我检查了点燃示例,不幸的是这些示例太简单了(即只有固定键,如1或2)。

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

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

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:1)

现在不支持自动增量字段,这是真的 作为选项,您可以通过例如Ignite's ID generator手动生成ID。