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

PostgreSQL触发器内numeric转integer出现赋值错误如何解决?

错误原因

你编写的PL/pgSQL触发器函数中,错误使用and关键字连接了两条独立的执行语句:new.aux_serie = new.aux_serie * 1000和后续的INSERT操作。PL/pgSQL会将这段逻辑识别为一个布尔表达式,尝试把布尔运算结果赋值给NEW这个记录类型变量,二者类型不匹配,因此触发cannot assign a non-composite value to a record type variable报错。

修复方案

将触发器函数中的and替换为分号;分隔两条独立语句即可,修正后的完整代码如下:

create or replace function aux_multiplicar()
returns trigger 
LANGUAGE PLPGSQL 
as
$body$
begin 
    -- 赋值语句结束用分号分隔
    new.aux_serie = new.aux_serie * 1000;
    insert into increments (serie) values (new.aux_serie::integer);
    return new;
end;
$body$;

create trigger aux_insertar 
before insert
on auxiliary 
for each row
execute procedure aux_multiplicar();

可选优化

如果你的auxiliary表仅作为CSV导入的临时中转表,不需要存储乘1000后的结果,也可以直接在插入业务表时计算,无需修改NEW变量:

create or replace function aux_multiplicar()
returns trigger 
LANGUAGE PLPGSQL 
as
$body$
begin 
    insert into increments (serie) values ((new.aux_serie * 1000)::integer);
    return new;
end;
$body$;

注意事项

如果CSV中导入的serie字段存在超过两位小数的情况,直接强转integer会报错,建议根据业务需求增加四舍五入或者截断逻辑,示例如下:

-- 四舍五入后转integer
insert into increments (serie) values (round(new.aux_serie * 1000)::integer);
-- 截断小数位后转integer
insert into increments (serie) values (trunc(new.aux_serie * 1000)::integer);

内容的提问来源于stack exchange,提问作者Esperanza Wiesse Gutierrez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:36:00