我有售票表:
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行
我已经对该功能进行了很多修改。但是,我似乎没有做好,谢谢。
答案 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();