PosqtgreSQL 集計を自動化してみる -> 失敗。
この方 http://d.hatena.ne.jp/Sikushima/ のブログとtwitterに触発されてストアドを試行錯誤してみる。
初ストアドなのでグダグダです。
child テーブルに変更がかかるたびに parent テーブルに child のレコード数を記録する。 みたいな。
※1. 最終的に動いてません。
※2. ブログ用に修正してあるので誤字脱字あるかも。
まずはテーブル
CREATE TABLE parent (
id serial primary key,
child_num integer
);CREATE TABLE child (
parent_id integer NOT NULL REFERENCES parent (id),
somthing integer
);
で、ファンクション。
CREATE OR REPLACE FUNCTION count_updater()
RETURNS "trigger" AS
$BODY$
BEGINIF ( (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') OR (TG_OP = 'DELETE') ) THEN
UPDATE
parent p
SET
child_num = c.count
FROM
(SELECT
parent_id,
count(*) as count
FROM
child c
WHERE
parent_id = NEW.parent_id
AND status = '0'
GROUP BY parent_id
) as c
WHERE
p.id = c.parent_id;
END IF ;
RETURN NEW;END ;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
CREATE TRIGGER trigger_count_updater
after INSERT OR UPDATE ON child
EXECUTE PROCEDURE count_updater()
;
実行すると 「NEWがない」というエラーメッセージで撃沈。
何か根本的な勘違いをしている予感がする....