我有一个包含id、status和dateadded的表。Id和dateadded分别默认为整数nextval和current_timestamp。然后我有一个触发器,它调用Insert、Update或Delete上的函数。在该功能中,它所做的只是备份和跟踪状态表中的更改。当有多个字段被添加到表中时,此方法成功工作。对于状态表,我只添加了状态字段,并让数据库处理其他2个字段,我收到了错误。看起来我可能需要在函数中做一些不同的事情?我正在使用python自动向这些表中添加数据,并尝试手动向表中添加记录,但出现了相同的错误。
Error while fetching data from PostgreSQL INSERT has more expressions than target columns
LINE 2: (TG_OP, NEW.*)
^
QUERY: INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*)
CONTEXT: PL/pgSQL function api_input.d_status_list_func() line 4 at SQL statement
功能代码:
create function d_status_list_func() returns trigger
language plpgsql
as
$$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, NEW.*);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO api_audit.d_status_list (id, status, dateadded) VALUES
(TG_OP, OLD.*);
RETURN OLD;
END IF;
END;
$$;
alter function d_status_list_func() owner to blahblah;
我们非常感谢任何协助。
插入失败,因为您为insert
(id, status, dateadded
(声明了三列,但您给了它4个值:操作(插入、更新、删除(,然后是3个原始列。
据推测,您的审核表有(或应该有(一列,用于存储正在执行的操作。
如果是这样,您应该在insert
语句中列出该列:
INSERT INTO api_audit.d_status_list (operation, id, status, dateadded)
VALUES (TG_OP, NEW.*);
一般来说,避免*
并明确列出列是一种很好的做法,这使得在出现问题时更容易追踪,因此:
INSERT INTO api_audit.d_status_list (operation, id, status, dateadded)
VALUES (TG_OP, NEW.id, NEW.status, NEW.dateadded);