我在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。任何帮助表示赞赏!谢谢。
答案 0 :(得分:3)
Ignite还不支持标识列[1]。
它可能不是obviuos,但Ignite SQL层构建在键值存储之上,可以由其他CacheStore支持。您的SQL查询永远不会按原样进入CacheStore。
Ignite internals将执行您的查询,将数据保存在缓存中,然后只有更新才会传播到CacheStore,这将为您的SQL服务器创建一个新的SQL查询。
因此,Ignite需要在保存在缓存中的数据之前知道标识列值(实际上是密钥)。
答案 1 :(得分:1)
现在不支持自动增量字段,这是真的 作为选项,您可以通过例如Ignite's ID generator手动生成ID。