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

