我是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;
所以逻辑是:将新记录插入数据库realestates_realestate后,我要检查所选字段是否为空或其他条件,然后进行更新。创建函数后,我想让触发器在插入表后启动该函数。
我做错了什么?我正在使用HeidiSQL(10.3.0.5771)并显示以下消息:
错误:RETURN附近的语法错误。第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 ..
BEFORE INSERT OR UPDATE on ....
FOR EACH ROW execute procedure czynsz_clear();
您收到的错误是由于您的UPDATE语句未以;
结尾的事实引起的。但是即使解决了这一问题,您也会遇到错误,因为无法像这样引用列名(在IF
部分中)。
最后,只有在IF
条件为真的情况下,触发器才起作用,因为否则触发器将不会返回任何内容。因此return new;
必须在IF
语句之外。