触发功能,可在更新特定列后更新一些列

时间:2019-06-01 22:40:19

标签: sql postgresql database-trigger

我有售票表:

Ticketsforsale(ticket_id, starting_date, price)

我需要创建一个触发函数,该函数在“ starting_date”更新的情况下,除了将“ price”降低20%之外,还将用更新后的函数替换旧的“ 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”列的值并尝试保存更改时,出现以下错误:

  

表“ ticketsforsale”第1行:缺少FROM子句条目:SELECT   new.starting_date!= ticketsforsale.starting_date *查询:SELECT   new.starting_date!= ticketsforsale.starting_date上下文:PL / pgsql   在IF处执行auto_update()第3行

我已经对该功能进行了很多修改。但是,我似乎没有做好,谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用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();