You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GridDB中使用继承目标表与继承源表执行UPDATE时出错

GridDB继承表结构下UPDATE语句触发140037错误的问题分析与解决

问题场景

当目标表与源表均采用继承表结构(包含PostgreSQL本地表和GridDB外部表)时,执行UPDATE语句会触发以下警告及错误:

WARNING: Fetched rowkey is not same as expected
ERROR: GridDB-API is failed by 140037 at griddb_fdw.c: 2754

复现步骤

执行以下SQL序列可复现问题:

create table foo (f1 int, f2 int);
create foreign table foo2 (f3 int) inherits (foo)
  server griddb_svr options (table_name 'loct1');
create table bar (f1 int, f2 int);
create foreign table bar2 (f3 int) inherits (bar)
  server griddb_svr options (table_name 'loct2');
alter table foo set (autovacuum_enabled = 'false');
alter table bar set (autovacuum_enabled = 'false');
alter foreign table foo2 alter column f1 options (rowkey 'true');
alter foreign table bar2 alter column f1 options (rowkey 'true');
insert into foo values(1,1);
insert into foo values(3,3);
insert into foo2 values(2,2,2);
insert into foo2 values(4,4,4);
insert into bar values(1,11);
insert into bar values(2,22);
insert into bar values(6,66);
insert into bar2 values(3,33,33);
insert into bar2 values(4,44,44);
insert into bar2 values(7,77,77);
update bar set f2 = f2 + 100
from
  ( select f1 from foo union all select f1+3 from foo ) ss
where bar.f1 = ss.f1;

错误原因分析

GridDB FDW在处理继承表的UPDATE关联查询时,无法正确处理本地表与外部表的行键映射关系:

  • 当通过继承表bar(包含本地表bar和外部表bar2)执行UPDATE时,FDW游标遍历行时会混淆本地行与GridDB外部行的行键校验逻辑;
  • 结合UNION ALL组合的数据源查询,游标指向的行键与预期的GridDB行键不匹配,触发行键校验失败,最终抛出140037错误(该错误对应GridDB API的行操作校验失败)。

解决思路

1. 拆分继承表操作,直接操作具体表

避免直接使用继承表作为UPDATE目标,分别对本地表和GridDB外部表执行更新:

-- 更新本地表bar
UPDATE bar SET f2 = f2 + 100
FROM (SELECT f1 FROM foo UNION ALL SELECT f1+3 FROM foo) ss
WHERE bar.f1 = ss.f1;

-- 更新GridDB外部表bar2
UPDATE bar2 SET f2 = f2 + 100
FROM (SELECT f1 FROM foo UNION ALL SELECT f1+3 FROM foo) ss
WHERE bar2.f1 = ss.f1;

2. 预存数据源结果到临时表

将UNION ALL的查询结果存入临时表,再基于临时表执行UPDATE,减少游标遍历的复杂度:

CREATE TEMP TABLE temp_ss AS SELECT f1 FROM foo UNION ALL SELECT f1+3 FROM foo;
UPDATE bar SET f2 = f2 + 100 FROM temp_ss WHERE bar.f1 = temp_ss.f1;
DROP TABLE temp_ss;

3. 检查并升级GridDB FDW版本

该问题可能是FDW的已知bug,升级到最新稳定版本的GridDB FDW,确认是否已修复继承表的UPDATE处理逻辑。

4. 验证行键配置一致性

确保GridDB外部表的rowkey列(此处为f1):

  • 在GridDB集群侧确实被配置为行键;
  • 数据类型与PostgreSQL侧完全一致,无隐式转换导致的行键值不匹配。

内容的提问来源于stack exchange,提问作者Salman Khwaja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:40:50