【问题标题】:Trigger function that Updates some columns after update of a specific column更新特定列后更新某些列的触发函数
【发布时间】:2019-06-01 22:40:18
【问题描述】:

我有桌子Ticketforsale:

Ticketsforsale(ticket_id, starting_date, price)

我需要创建一个触发器函数,如果“starting_date”更新,除了将“价格”降低 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”列的值并尝试保存更改时,我收到以下错误:

表“ticketsforsale”第 1 行缺少 FROM 子句条目:SELECT new.starting_date != ticketforsale.starting_date * QUERY: SELECT new.starting_date != ticketforsale.starting_date 上下文:PL/pgsql 函数自动更新()在 IF 的第 3 行

我已经对函数进行了相当多的修改。不过我好像没弄好,谢谢。

【问题讨论】:

    标签: sql postgresql database-trigger


    【解决方案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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-20
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多