PostgreSQL插入数据报错:cannot cast type integer to json 求助
问题分析与解决方案
这个错误的核心原因是你在触发器函数的json_build_object调用中,错误地使用了双引号包裹JSON键名,而非PostgreSQL要求的单引号。这会导致PostgreSQL将键名解析为标识符(比如列名)而非字符串字面量,进而引发类型不匹配问题。
详细解释
在PostgreSQL的语法规则里:
- 单引号(
')用来定义字符串字面量(比如JSON键名这类固定文本) - 双引号(
")用来引用标识符(比如表名、列名、变量名)
你的函数代码里写了:
json_build_object("abc", NEW.col2val1::json, "def", NEW.col2val2::json, "ghi", NEW.col2val3::json)
这里的"abc"会被PostgreSQL解析为一个标识符——如果你的tableA恰好有一个名为abc的integer类型列,那么"abc"就等价于NEW.abc(一个integer值)。当你把这个integer值作为json_build_object的键传入时,虽然PostgreSQL会尝试将其转为text类型作为键名,但结合后续的::json强制转换,会触发内部类型冲突,最终抛出cannot cast type integer to json的错误。
修正步骤
- 替换引号类型:把所有包裹JSON键名的双引号改为单引号,确保PostgreSQL将其识别为字符串字面量。
- 移除不必要的强制转换:
json_build_object会自动将PostgreSQL原生类型(比如integer)转换为对应的JSON类型,不需要手动加::json,去掉这些强制转换可以避免潜在的类型错误。
修正后的触发器函数代码如下:
CREATE OR REPLACE FUNCTION schemaname.funcA() RETURNS trigger AS $BODY$ BEGIN insert into schemaname.tableB(col1, col2) values( NEW.val1, json_build_object( 'abc', NEW.col2val1, 'def', NEW.col2val2, 'ghi', NEW.col2val3 ) ); RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100;
额外验证
修正后,json_build_object会正确生成包含指定键值对的JSON对象,插入到tableB的col2(json类型)列中,同时NEW.val1(integer类型)也能正确匹配tableB.col1的类型,不会再触发类型转换错误。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

