Database 插入前(语句级触发器)不起作用

Database 插入前(语句级触发器)不起作用,database,postgresql,function,triggers,Database,Postgresql,Function,Triggers,本人已执行以下声明: create table tab1(id int , name varchar(10) , city varchar(10) , latest bool default true); CREATE OR REPLACE FUNCTION public.updateoldrow() RETURNS trigger LANGUAGE plpgsql AS $function$ begin update tab1 set latest ='0' where name = new.

本人已执行以下声明:

create table tab1(id int , name varchar(10) , city varchar(10) , latest bool default true);
CREATE OR REPLACE FUNCTION public.updateoldrow()
RETURNS trigger
LANGUAGE plpgsql
AS $function$
begin
update tab1 set latest ='0' where name = new.name and city = new.city and latest = '1';
RETURN NEW;
END;
$function$
;

create trigger trig_updateoldrow before
insert
on
public.tab1 for each statement execute procedure updateoldrow();

insert into tab1 values(1,'Shiwangini','xyz','true');
insert into tab1 values(2,'Shiwangini','xyz','true');
我创建了一个table+函数,用相同的匹配值条件将旧记录更新为'false',然后创建了一个语句级触发器before insert->然后在其中插入了2条测试记录。 现在,当我运行'select*from tab1;'根据预期,id=1的第一个值应设置为“false”。然而,这并没有发生。我还检查了insert语句的执行计划,所以它正在调用触发器:

    explain (analyze true, verbose, costs, buffers)insert into tab1 
    values(2,'Shiwangini','xyz','true');

    Insert on public.tab1  (cost=0.00..0.01 rows=1 width=81) (actual time=0.113..0.113 rows=0 
    loops=1)
    Buffers: shared read=1 dirtied=1
  ->  Result  (cost=0.00..0.01 rows=1 width=81) (actual time=0.001..0.001 rows=1 loops=1)
    Output: 2, 'Shiwangini'::character varying(10), 'xyz'::character varying(10), true
    Planning Time: 0.020 ms
    Trigger trig_updateoldrow: time=0.060 calls=1
    Execution Time: 0.128 ms
然而,如果我试图通过行级触发器实现相同的功能,它工作正常并更新旧值

在这里,我无法理解为什么语句级触发器不能按预期执行。如果有任何理由,我们将不胜感激。

新的

数据类型记录;在行级触发器中保存用于插入/更新操作的新数据库行的变量。 对于语句级触发器和删除操作,此变量为null

因此,由于新值为null,更新无法正常工作。你真的需要一个行级触发器