PostgreSQL INSERT INTO语句异常:is_latest字段值全为false
目标表字段类型不匹配
检查core.fact_request_tickets的is_latest字段定义,如果是VARCHAR而非BOOLEAN类型,插入时布尔值true会被隐式转为字符串,后续查询时字符串'true'在布尔判断场景下会被解析为false;若字段长度过短(比如CHAR(1)),true会被截断为t,同样会被识别为false。
验证方法:执行DESCRIBE core.fact_request_tickets;查看字段类型,确保和CTE中is_latest的布尔类型一致。插入语句字段映射错误
检查插入语句的字段列表,是否存在is_latest字段漏写、映射到错误列的情况,导致目标表该字段被默认值(如false)填充。
错误示例:INSERT INTO core.fact_request_tickets (col1, col2) SELECT col1, col2 FROM finalTable;正确写法需包含目标字段:
INSERT INTO core.fact_request_tickets (col1, col2, is_latest) SELECT col1, col2, is_latest FROM finalTable;事务或执行顺序导致的数据变更
如果脚本中删除建表、CTE计算、插入操作不在同一事务内,中间可能有其他操作修改了lastStatus表的数据,导致完整脚本执行时CTE重新计算的结果与单独查询时不同。比如单独查询CTE后,lastStatus表的最新状态数据被更新,再执行完整脚本时关联逻辑得到的is_latest就全为false。
解决方法:将完整脚本放在同一事务中执行,或执行前锁定相关表避免数据变更。CTE逻辑依赖会话级状态
检查finalTable中is_latest的计算逻辑,是否依赖会话变量、临时表等会话级状态。比如单独查询时会话中存在某个临时变量值,但完整脚本里建表操作重置了会话状态,导致计算结果异常。
示例:若计算时用到@latest_status变量,单独查询时该变量有值,完整脚本执行时变量未初始化,就会导致is_latest全为false。数据库隐式转换或函数行为差异
部分数据库对布尔值的处理有特殊逻辑,比如用CASE语句返回1/0代替布尔值时,若目标表是BOOLEAN类型,部分数据库会正常转换,但如果返回的是'true'/'false'字符串,插入时可能被错误解析为false。
内容的提问来源于stack exchange,提问作者user1893649

