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$
BEGIN

IF ( (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がない」というエラーメッセージで撃沈。

何か根本的な勘違いをしている予感がする....