在更新特定列后更新某些列的触发函数

Trigger function that Updates some columns after update of a specific column

我有table张待售门票:

Ticketsforsale(ticket_id, starting_date, price)

我需要创建一个触发器函数,如果在 "starting_date" 上进行更新,除了将 "price" 降低 20 之外,还将用更新后的 "starting_date" 替换旧的 "starting_date" %.

到目前为止我想出的触发函数如下:

 create or replace function automatic_update()
RETURNS TRIGGER AS $$ 
begin 
IF new.starting_date != ticketsforsale.starting_date 
THEN old.starting_date = new.starting_date , 
     ticketsforsale.price = ticketsforsale.price * (20/100) ; 
END IF ; 
RETURN NEW ; 
END ;
$$ 
LANGUAGE plpgsql ;

CREATE TRIGGER automation
BEFORE INSERT OR UPDATE ON public.ticketsforsale
FOR EACH ROW EXECUTE PROCEDURE automatic_update()

触发函数代码运行正确无误

但是当我更新 "starting_date" 列的值并尝试保存更改时,出现以下错误:

Missing FROM-clause entry on table 'ticketsforsale' LINE 1 :SELECT new.starting_date != ticketsforsale.starting_date * QUERY: SELECT new.starting_date != ticketsforsale.starting_date CONTEXT: PL/pgsql function automatic_update() line 3 at IF

我已经对函数进行了大量修改。但是我似乎没有做对,谢谢。

您可以使用 old 伪记录访问更新前的值。但是设置 old 值没有意义。这样的触发器对于 INSERT 没有意义,因为这里没有可以更改的旧值。而且您没有将价格降低 20%,而是将其设置为 20%。

像下面这样的东西应该可以如你所愿。

CREATE OR REPLACE FUNCTION automatic_update()
                           RETURNS TRIGGER
AS
$$ 
BEGIN
  IF new.starting_date <> old.starting_date THEN
    new.price := old.price * .8; 
  END IF; 

  RETURN new; 
END;
$$ 
LANGUAGE plpgsql;

CREATE TRIGGER automation
               BEFORE UPDATE
               ON public.ticketsforsale
               FOR EACH ROW
               EXECUTE PROCEDURE automatic_update();

您也可以将条件移动到触发器 WHEN

CREATE OR REPLACE FUNCTION automatic_update()
                           RETURNS TRIGGER
AS
$$ 
BEGIN
  new.price := old.price * .8; 

  RETURN new; 
END;
$$ 
LANGUAGE plpgsql;

CREATE TRIGGER automation
               BEFORE UPDATE
               ON public.ticketsforsale
               FOR EACH ROW
               WHEN (new.starting_date <> old.starting_date)
               EXECUTE PROCEDURE automatic_update();