我正在尝试创建一个函数,该函数将字段更新为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;