我在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 回答
这是正确的,因为现在不支持自动增量字段 .
作为选项,您可以通过例如Ignite's ID generator手动生成ID .
Ignite还不支持标识列[1] .
它可能不是obviuos,但Ignite SQL层构建在键值存储之上,可以由其他CacheStore支持 . 您的SQL查询永远不会按原样进入CacheStore .
Ignite内部将执行您的查询,将数据保存在缓存中,然后只有更新才会传播到CacheStore,这将为您的SQL服务器创建一个新的SQL查询 .
因此,Ignite需要在保存在缓存中的数据之前知道标识列值(实际上是密钥) .
[1] https://issues.apache.org/jira/browse/IGNITE-5625