首页 文章

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

提问于
浏览
0

我在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 = [位于org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query的org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:807)中的“str”]](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)at org org.apache.ignite.internal.util.lang.IgniteOutClosureX.app上的.apache.ignite.internal.processors.query.GridQueryProcessor $ 5.applyx(GridQueryProcessor.java:1813) (org.apache.ignite.internal.processors.query.GridQueryProcessor.executeQuery(GridQueryProcessor.java:2293)org.apache.ignite.internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor)中的(IgniteOutClosureX.java:36) . java:1820)at 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)at 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.updateSqlFiel ds(DmlStatementsProcessor.java:164)位于org.apache.inite.processors.query.h2.IgniteH2Indexing的org.apache.ignite.internal.processors.query.h2.DmlStatementsProcessor.updateSqlFieldsDistributed(DmlStatementsProcessor.java:222) . queryDistributedSqlFields(IgniteH2Indexing.java:1321)......还有11个

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

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

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

我使用的是ignite-core 2.2.0 . 任何帮助表示赞赏!谢谢 .

2 回答

  • 1

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

  • 3

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

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

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

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

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

相关问题