插入后 PosgreSQL 触发函数更新
PosgreSQL trigger function update after insert
我是 PosgreSQL 触发器的新手。根据文档,我试图制作触发器功能,但它不起作用,也不知道为什么。
有一个插入到我的房地产数据库记录中的刮擦。我想根据选定的条件更新新插入的记录。
这是我的触发功能代码:
CREATE OR REPLACE FUNCTION czynsz_clear() RETURNS TRIGGER AS $body$
BEGIN
IF administrative_fees IS NOT NULL
AND administrative_fees_m2 IS NULL
AND area IS NOT NULL
AND type_id IN (6,1)
AND administrative_fees > 1 AND area > 1
THEN
UPDATE realestates_realestate SET administrative_fees_m2 = TRUNC((administrative_fees/ AREA):: INTEGER,2)
RETURN NEW;
END IF;
END;
$body$ LANGUAGE plpgsql;
所以逻辑是:
插入 DB realestates_realestate 一条新记录后,我想检查所选字段是否为空或其他条件,然后进行更新。
创建函数后,我想让触发器在插入 table 后启动此函数。
我做错了什么?我正在使用 HeidiSQL (10.3.0.5771) 并出现消息:
ERROR: syntax error at near RETURN. Line 11: RETURN NEW;
删除此RETURN NEW后,出现错误END IF;和相同的消息。
如果要更改刚刚插入的行,请不要使用UPDATE
将值分配给字段或新记录。
要访问列值,也请使用 new
记录。
像这样:
CREATE OR REPLACE FUNCTION czynsz_clear()
RETURNS TRIGGER
AS $body$
BEGIN
if new.administrative_fees IS NOT NULL
AND new.administrative_fees_m2 IS NULL
AND new.area IS NOT NULL
AND new.type_id IN (6,1)
AND new.administrative_fees > 1
AND new.area > 1
THEN
new.administrative_fees_m2 := TRUNC((administrative_fees/ AREA)::INTEGER,2);
END IF;
RETURN NEW; -- this needs to be outside of the IF
END;
$body$ LANGUAGE plpgsql;
这假定触发器定义为行级触发器,例如
您还需要将其设置为 BEFORE 触发器
create trigger ..
<b>BEFORE INSERT OR UPDATE</b> on ....
<b>FOR EACH ROW</b> execute procedure czynsz_clear();
您遇到的错误是由于您的 UPDATE 语句没有以 ;
结束。但即使在修复它之后,您也会遇到错误,因为不能像那样引用列名(在 IF
部分)。
最后,触发器只有在 IF
条件为真时才会起作用,否则触发器不会 return 任何东西。所以 return new;
需要在 IF
语句之外。
我是 PosgreSQL 触发器的新手。根据文档,我试图制作触发器功能,但它不起作用,也不知道为什么。 有一个插入到我的房地产数据库记录中的刮擦。我想根据选定的条件更新新插入的记录。 这是我的触发功能代码:
CREATE OR REPLACE FUNCTION czynsz_clear() RETURNS TRIGGER AS $body$
BEGIN
IF administrative_fees IS NOT NULL
AND administrative_fees_m2 IS NULL
AND area IS NOT NULL
AND type_id IN (6,1)
AND administrative_fees > 1 AND area > 1
THEN
UPDATE realestates_realestate SET administrative_fees_m2 = TRUNC((administrative_fees/ AREA):: INTEGER,2)
RETURN NEW;
END IF;
END;
$body$ LANGUAGE plpgsql;
所以逻辑是: 插入 DB realestates_realestate 一条新记录后,我想检查所选字段是否为空或其他条件,然后进行更新。 创建函数后,我想让触发器在插入 table 后启动此函数。
我做错了什么?我正在使用 HeidiSQL (10.3.0.5771) 并出现消息:
ERROR: syntax error at near RETURN. Line 11: RETURN NEW;
删除此RETURN NEW后,出现错误END IF;和相同的消息。
如果要更改刚刚插入的行,请不要使用UPDATE
将值分配给字段或新记录。
要访问列值,也请使用 new
记录。
像这样:
CREATE OR REPLACE FUNCTION czynsz_clear()
RETURNS TRIGGER
AS $body$
BEGIN
if new.administrative_fees IS NOT NULL
AND new.administrative_fees_m2 IS NULL
AND new.area IS NOT NULL
AND new.type_id IN (6,1)
AND new.administrative_fees > 1
AND new.area > 1
THEN
new.administrative_fees_m2 := TRUNC((administrative_fees/ AREA)::INTEGER,2);
END IF;
RETURN NEW; -- this needs to be outside of the IF
END;
$body$ LANGUAGE plpgsql;
这假定触发器定义为行级触发器,例如
您还需要将其设置为 BEFORE 触发器
create trigger ..
<b>BEFORE INSERT OR UPDATE</b> on ....
<b>FOR EACH ROW</b> execute procedure czynsz_clear();
您遇到的错误是由于您的 UPDATE 语句没有以 ;
结束。但即使在修复它之后,您也会遇到错误,因为不能像那样引用列名(在 IF
部分)。
最后,触发器只有在 IF
条件为真时才会起作用,否则触发器不会 return 任何东西。所以 return new;
需要在 IF
语句之外。