0

我对触发功能很陌生。实际上这是我第一次使用它,我不能忽略一个问题。这是我的代码:

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 时,我没有得到任何结果(但也没有错误)。有任何想法吗?谢谢你。

4

1 回答 1

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() 值。

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

于 2012-06-23T08:55:29.480 回答