1
親レコードに子レコードの数を自動的に格納する親子テーブルがあります。更新はそれほど頻繁ではありませんが、読んでいるので、これは(私にとっては)キャッシュするのに賢明な数字です。私はnumchildren
を更新してしまうトリガーを追加しましたが、それは常にchild
テーブル内のレコードの完全な合計だけでなく、特定の親のカウントのnumchildren
を設定親テーブル内の子の総数を自動的に維持する
create table parent(
id SERIAL PRIMARY KEY,
numchildren integer not null default 0
);
create table child(
id serial primary key
parent_id integer NOT NULL REFERENCES parent(id)
);
:表には、このような何かを見ても。
CREATE OR REPLACE FUNCTION run_after_change() RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'DELETE' THEN
UPDATE parent
SET numchildren = (SELECT COUNT(*) FROM child WHERE OLD.parent_id = parent.id)
WHERE OLD.parent_id = parent.id;
RETURN OLD;
ELSIF TG_OP = 'UPDATE' OR TG_OP = 'INSERT' THEN
UPDATE parent
SET numchildren = (SELECT COUNT(*) FROM child WHERE NEW.parent_id = parent.id)
WHERE NEW.parent_id = parent.id;
RETURN NEW;
END IF;
END; $$ language 'plpgsql';
CREATE TRIGGER after_change
AFTER DELETE OR INSERT OR UPDATE ON child
FOR EACH ROW EXECUTE PROCEDURE run_after_change();
何が間違っていますか?
(
DELETE
一部またはOLD.parent_id
)、しかし:
parent.id
は、それがあるべきであるparent_id
なければならない言語名は識別子です。これを一重引用符で囲み、代わりに 'language plpgsql'を使用してください。 –