我有父子表,其中我希望自动存储父记录中的子代数量的计数。更新不是很频繁,但读取很频繁,所以这是一个合理的(对我来说)缓存的数字。这些表可能如下所示:
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表中的全部记录,而不仅仅是特定父级的计数。
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();我做错了什么?
发布于 2017-01-19 04:18:26
count(*)查询的where子句错误。
parent.id应该是parent_id它应该是:
SELECT COUNT(*) FROM child WHERE parent_id = NEW.parent_id(或DELETE部件的OLD.parent_id )
https://stackoverflow.com/questions/41728515
复制相似问题