关于postgresql:插入后PostgreSQL触发函数更新

PosgreSQL trigger function update after insert

我是 PosgreSQL 触发器的新手。根据文档,我试图制作触发功能,但它不起作用,也不知道为什么。
有一个抓取插入到我的房地产数据库记录中。我想根据选定的条件更新新插入的记录。
这是我的触发功能代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
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) 并出现消息:

ERROR: syntax error at near RETURN. Line 11: RETURN NEW;

删除这个RETURN NEW后,出现错误END IF;和相同的消息。


如果要更改刚刚插入的行,请不要使用 UPDATE 将值分配给字段或新记录。

要访问列值,也可以使用 new 记录。

类似这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 触发器

1
2
3
CREATE TRIGGER ..
  BEFORE INSERT OR UPDATE ON ....
  FOR EACH ROW EXECUTE PROCEDURE czynsz_clear();

你得到的错误是由于你的 UPDATE 语句没有以 ; 结束。但即使在修复它之后,你也会得到错误,因为列名(在 IF 部分中)不能像那样被引用。

最后,触发器只有在 IF 条件为真的情况下才会起作用,否则触发器不会返回任何东西。所以 return new; 需要在 IF 语句之外。