我是 PostgreSQL 触发器的新手。根据文档,我试图制作触发器功能,但它不起作用并且不明白为什么。
有一个抓取插入到我的房地产数据库记录中。我想根据选定的条件更新新插入的记录。
这是我的触发功能代码:
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;
所以逻辑是这样的: 将新记录插入数据库realestates_realestate后,我想检查:所选字段是否为空或其他条件,然后进行更新。 创建函数后,我想让触发器在插入表后启动此函数。
我做错了什么?我正在使用 HeidiSQL (10.3.0.5771) 并出现此消息:
错误:RETURN 附近的语法错误。第 11 行:返回新的;
我删除这个 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 ..
BEFORE INSERT OR UPDATE on ....
FOR EACH ROW execute procedure czynsz_clear();
您收到的错误是由于您的 UPDATE 语句未以
;
结束而引起的。但即使修复了这个问题,您也会收到错误,因为列名称(在 IF
部分)不能像这样引用。
最后,触发器仅在
IF
条件为真时才起作用,因为否则触发器不会返回任何内容。因此 return new;
需要位于 IF
语句之外。