我在 SQL Server 中有一个表,其中主键是自动生成的(标识列),即
CREATE TABLE TableName
(
table_id INT NOT NULL IDENTITY (1,1),
some_field VARCHAR(20),
PRIMARY KEY (table_id)
);
Run Code Online (Sandbox Code Playgroud)
由于table_id是自动生成的列,因此当我实现该SqlFieldQuery INSERT子句时,我没有将任何参数设置为table_id:
sql = new SqlFieldsQuery("INSERT INTO TableName (some_field) VALUES (?)");
cache.query(sql.setArgs("str");
Run Code Online (Sandbox Code Playgroud)
但是在运行时我收到以下错误:
线程“main”中的异常 javax.cache.CacheException: class org.apache.ignite.internal.processors.query.IgniteSQLException: 无法执行 DML 语句 [stmt=INSERT INTO TableName (some_field) VALUES (?), params=[" str"]]
在 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"]]在 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) 在 org.apache.ignite .internal.processors.query.GridQueryProcessor.querySqlFields(GridQueryProcessor.java:1820) 在 org.apache.ignite.internal.processors.cache.IgniteCacheProxy.query(IgniteCacheProxy.java:795) ... 5 更多 引起:类 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) at org.apache.ignite.internal.processors.query。 h2.dml.UpdatePlanBuilder.planForStatement(UpdatePlanBuilder.java:82) 在 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个
这就是我计划实现插入的方式,因为table_id从缓存、增量和插入中获取最大值似乎更乏味。我以为我可以table_id从插入中省略并让 SQL Server 插入 pk,但它似乎不是这样工作的。
你能告诉我这通常应该如何在 Ignite 中实现吗?我检查了 ignite-examples,不幸的是这些例子太简单了(即只有固定键,比如 1 或 2)。
此外,Ignite 是如何支持使用序列的?
我正在使用 ignite-core 2.2.0。任何帮助表示赞赏!谢谢你。
小智 5
Ignite 尚不支持标识列 [1]。
它可能并不明显,但 Ignite SQL 层建立在键值存储之上,可以由其他 CacheStore 支持。您的 SQL 查询永远不会按原样进入 CacheStore。
Ignite 内部将执行您的查询,将数据保存在缓存中,然后更新才会传播到 CacheStore,这将为您的 SQL 服务器创建一个新的 SQL 查询。
因此,Ignite 需要在将数据保存在缓存中之前知道标识列的值(实际上是一个键)。
[1] https://issues.apache.org/jira/browse/IGNITE-5625
| 归档时间: |
|
| 查看次数: |
2685 次 |
| 最近记录: |