我有两个表,tasks
和subtasks
。每个子任务都有一个状态(首次插入时为PENDING)。然后我运行更新每个子任务的线程(状态变为READY)。我想要的是当给定任务的每个子任务变为READY时,他们的父任务也准备就绪。这是我写的触发器:
CREATE FUNCTION update_task_status() RETURNS trigger AS $$
BEGIN
INSERT INTO trigger_log SELECT NEW.subtask_id, COUNT(fo_id) FROM subtasks WHERE fo_id = NEW.fo_id AND status <> 'READY';
UPDATE tasks
SET status = 'READY'
WHERE task_id = NEW.fo_id
AND NOT EXISTS (
SELECT 1
FROM subtasks
WHERE fo_id = NEW.fo_id
AND status <> 'READY'
);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER update_task AFTER INSERT OR UPDATE ON subtasks
FOR EACH ROW EXECUTE PROCEDURE update_task_status();
当我使用一个任务和4个子任务测试时,这是trigger_log
表中插入的内容:
ID Pending_count
2 3
1 3
3 3
4 3
最重要的是,在测试完成后,所有子任务都处于READY状态,但它们的主要任务仍然是PENDING。基本上触发器不能正确计数。有什么想法吗?
答案 0 :(得分:0)
首先,我想提出DanielVérité的建议,在这里使用可序列化模式(或SELECT ... FOR UPDATE)。
但是,您的问题在细节上很短,因此可能不是问题。以下是要检查的事项:
如果您正常运行查询,它会按预期执行吗?首先解决您的疑问。如果没有,那么你需要找出下面的数据导致问题。鉴于您似乎使用字符串作为状态,这可能是一个非常微妙的问题,例如,空格。
触发器被触发了吗?您可以在触发器中添加RAISE NOTICE,以确保您在psql中看到它实际正在触发。如果没有,你需要找出原因(可能是禁用了,或者你的查询没有做你认为它正在做的事情)。