gpt4 book ai didi

sql - 为什么我的 POSTGRESQL 触发器函数在使用 NEW 参数时找不到我的列?

转载 作者:行者123 更新时间:2023-11-29 13:20:00 25 4
gpt4 key购买 nike

我正在尝试创建一个函数,当另一列的字段为某个值时,将字段更新为 0。这是我的 table

flightbooking
---------------------------------
| bookingID | numseats | status |
---------------------------------
| 1 | 5 | R |
| 2 | 8 | R |
---------------------------------

因此,当状态从“R”更改为“C”时,我希望相应的 numseats 值设置为 0。像这样:

 ---------------------------------
| bookingID | numseats | status |
---------------------------------
| 1 | 0 | C |

暗示预订已取消且座位未分配。

所以我决定触发器函数是我最好的选择。这是我的代码:

CREATE OR REPLACE  FUNCTION removeSeats()
RETURNS trigger AS $$
begin
IF pg_trigger_depth() <> 1 THEN
RETURN NEW;
END IF;

UPDATE flightbooking
set NEW.numseats = 0;
return NEW;

END; $$ LANGUAGE plpgsql;


--Trigger
CREATE TRIGGER removeseats
AFTER UPDATE
on flightbooking
FOR EACH ROW
WHEN (NEW.status = 'C' )
EXECUTE PROCEDURE removeSeats();

现在最初是行

set NEW.numseats = 0;

set numseats = 0;

这已执行但将 numseats 的所有字段设置为 0 而不是“THIS”字段。这就是为什么我决定我需要使用 NEW 的原因。但是,这会引发以下错误:

ERROR:  column "new" of relation "flightbooking" does not exist
LINE 2: set NEW.numseats = 0

这是我用来测试触发函数的查询

update flightbooking
set status = 'C'
where bookingid = 1

有什么想法吗?

非常感谢。

最佳答案

根本不需要更新。在 before 触发器中,您可以简单地分配您想要的值:

CREATE OR REPLACE  FUNCTION removeSeats()
RETURNS trigger AS $$
begin
IF pg_trigger_depth() <> 1 THEN
RETURN NEW;
END IF;

NEW.numseats := 0;
return NEW;

END; $$
LANGUAGE plpgsql;

直接更改 NEW 记录比对更新的每一行运行第二次更新更有效。

为了使其工作,您必须将触发器定义为 BEFORE 触发器。

CREATE TRIGGER removeseats
<b>BEFORE</b> UPDATE
on flightbooking
FOR EACH ROW
WHEN (NEW.status = 'C' )
EXECUTE PROCEDURE removeSeats();

关于sql - 为什么我的 POSTGRESQL 触发器函数在使用 NEW 参数时找不到我的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43717288/

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