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

Why can't my POSTGRESQL trigger function find my column when using the NEW parameter?

我正在尝试创建一个函数,当另一列的字段为特定值时,将字段更新为 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

知道为什么吗?

非常感谢。

你的更新查询是错误的,你的更新查询中没有where子句。

这样试试

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

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

END; $$ LANGUAGE plpgsql;

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

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