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 に答える