2017-01-18 4 views
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(); 

何が間違っていますか?

+1

DELETE一部またはOLD.parent_id

SELECT COUNT(*) FROM child WHERE parent_id = NEW.parent_id 

、しかし:

parent.idは、それがあるべきであるparent_idなければならない言語名は識別子です。これを一重引用符で囲み、代わりに 'language plpgsql'を使用してください。 –

答えて

2

count(*)クエリのWHERE句が間違っています。無関係

関連する問題