插入后 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 语句之外。