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

PostgreSQL 14修改UDT属性后NULL检查失效的问题及解决

问题原因与解决方法

原因

当通过ALTER TYPE ... ADD ATTRIBUTE给复合UDT(如类型A)新增属性后,表中已存储的旧数据并不会自动更新为新的类型结构。查询时PostgreSQL会临时将旧格式的UDT值转换为新格式(新增字段填充为NULL),但在PostgreSQL 14中,这种临时转换后的复合类型实例,IS NOT NULL判断会错误返回false——内部会将这类“不完整”的转换结果识别为无效,而非合法的非NULL复合实例。

解决方法

方法1:强制更新数据存储格式

执行更新语句,把表中现有数据重新转换为当前的AorB类型,让数据以新的二进制格式持久化存储,后续NULL判断即可恢复正常:

UPDATE elements SET attr = attr::AorB;

执行后再运行原查询,就能正确筛选出目标数据。

方法2:修改查询逻辑,检查具体字段

不需要修改数据,直接判断复合类型的原有非空字段是否存在值,绕开临时转换带来的判断问题:

SELECT * FROM elements WHERE (attr).a.foo IS NOT NULL;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:30