在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
相关产品推荐
相关产品推荐

