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