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

PostgreSQL触发器执行报错INSERT表达式多于目标列如何解决

错误产生原因
  • 核心原因是触发器中向RA_log表插入数据时,值的数量和RA_log的字段数量不匹配:RA_log仅定义了5个字段,但是你在插入时除了前3个固定值(操作类型、操作用户、操作时间),还直接传入了OLD.*/NEW.*(也就是reports表整行的10个字段值),总共传入13个值,远多于RA_log的字段数,因此触发字段数不匹配的报错。
  • 额外问题:你向reports表插入数据的INSERT语句中,多个列名和reports表定义的列名不一致:表定义的用户名字段为report_user_name、人数字段为report_number_people、备注字段为report_observations,而你写的是report_username、report_quantity_people、report_observacoes,就算触发器问题解决,这行INSERT也会报错。
解决方案
  1. 修改触发器函数,插入RA_log时明确指定需要从reports行提取的字段,不要直接用*取整行:
CREATE OR REPLACE FUNCTION audita_RA_log() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'DELETE') THEN
INSERT INTO RA_log VALUES ('D', USER, now(), OLD.report_user_name, OLD.report_number_people);
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
INSERT INTO RA_log VALUES ('U', USER, now(), NEW.report_user_name, NEW.report_number_people);
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
INSERT INTO RA_log VALUES ('I', USER, now(), NEW.report_user_name, NEW.report_number_people);
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
  1. 修正向reports表插入数据的INSERT语句列名,和表定义、字段类型保持一致:
INSERT INTO reports (report_user_name, report_location_name, report_number_people, report_mask, report_distance, report_observations, report_date_time, report_latitude, report_longitude)
VALUES ('Scooby', 'Lucky Lottery', 20, 'No', '1'::BOOLEAN, 'Lots of people', '2021-06-22 4:10:25-07'::timestamp,'-6.47926', '-35.4348' );

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:39:04