首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自动维护父表中的子项总数

自动维护父表中的子项总数
EN

Stack Overflow用户
提问于 2017-01-19 04:06:50
回答 1查看 143关注 0票数 1

我有父子表,其中我希望自动存储父记录中的子代数量的计数。更新不是很频繁,但读取很频繁,所以这是一个合理的(对我来说)缓存的数字。这些表可能如下所示:

代码语言:javascript
复制
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)
);

我添加了一个用于更新numchildren的触发器,但它始终将numchildren设置为child表中的全部记录,而不仅仅是特定父级的计数。

代码语言:javascript
复制
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();

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-19 04:18:26

count(*)查询的where子句错误。

parent.id应该是parent_id它应该是:

代码语言:javascript
复制
SELECT COUNT(*) FROM child WHERE parent_id = NEW.parent_id

(或DELETE部件的OLD.parent_id )

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41728515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档