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

