Postgresql触发器功能不起作用

时间:2012-06-23 08:38:15

标签: sql database postgresql triggers

我很想触发功能。实际上这是我第一次使用它,我无法解决问题。这是我的代码:

CREATE OR REPLACE FUNCTION altitude()
  RETURNS trigger AS $$
DECLARE
 maxaltimeter DOUBLE PRECISION;

BEGIN

  SELECT max(altitude) INTO maxaltimeter FROM waypoints WHERE flight_id = OLD.id;
  RETURN NEW;
  UPDATE flights SET max_altimeter = NEW.maxaltimeter WHERE id=OLD.id;


END;
$$
LANGUAGE plpgsql VOLATILE
COST 100;

CREATE TRIGGER set_altitude
  AFTER UPDATE OF status
  ON flights
  FOR EACH ROW
  EXECUTE PROCEDURE altitude();

在'航班'表(状态栏)上运行UPDATE时,我没有得到任何结果(但也没有错误)。有任何想法吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

你的陈述顺序错误。 RETURN NEW将终止触发器,因此不会运行更新。

应该是:

SELECT max(altitude) INTO maxaltimeter FROM waypoints WHERE flight_id = OLD.id;
UPDATE flights SET max_altimeter = NEW.maxaltimeter WHERE id=OLD.id;
RETURN NEW;

但我希望你知道这不是一个可扩展的解决方案。

通常最好不在数据库中存储计算/聚合值,而是在检索数据时计算它们。为方便起见,您可能希望创建一个视图,返回每个航班的max()值。

预先计算这样一个值的唯一原因是,如果检索真的昂贵且你必须经常非常与更新和检索相比性能比更新性能更重要。