gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:50:03 25 4
gpt4 key购买 nike

我有一张 Ticketsforsale 表:

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();

关于sql - 在更新特定列后更新某些列的触发函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56410948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com