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也会报错。
解决方案
- 修改触发器函数,插入
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;
- 修正向
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
相关产品推荐
相关产品推荐

