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



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

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

因此,当状态从" r"更改为'c'时,我希望将corexpers的numseat值设置为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"字段。这就是为什么我决定需要使用新的原因。但是,这引发了以下错误:

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

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

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

有什么想法为什么?

非常感谢。

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

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
BEFORE UPDATE 
on flightbooking
FOR EACH ROW
WHEN (NEW.status = 'C' )
EXECUTE PROCEDURE removeSeats();

您的更新查询是错误的,并且您的更新中没有句子查询。

以这种方式尝试

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;

最新更新