在更新特定列后更新某些列的触发函数
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();
我有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();