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

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的错误。

修正步骤

  1. 替换引号类型:把所有包裹JSON键名的双引号改为单引号,确保PostgreSQL将其识别为字符串字面量。
  2. 移除不必要的强制转换: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:33:57