这个简单的触发器有什么问题?

时间:2016-07-10 16:40:59

标签: postgresql triggers

我有一个民意调查表

Poll(id, number_of_questions)

其中包含有关民意调查的信息以及每个民意调查所包含的问题数量。

我有一个问题表

Question(id, text)

然后我有一个组合表

Composition(poll, question)

民意调查引用Poll.id和问题引用Question.id

如您所知,最后一个表格包含每个民意调查及其问题之间的关联。

我做了一个应该递增的触发器

number_of_questions

每次对作文进行INSERT后

CREATE FUNCTION increment() RETURNS TRIGGER AS $$
BEGIN
UPDATE poll SET number_of_questions = number_of_questions + 1 WHERE poll.id = composition.poll;
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
CREATE TRIGGER incrementQuestionNumber
AFTER INSERT ON composition FOR EACH ROW
EXECUTE PROCEDURE increment();

所以,让我们说我创建了一个id = 3的新问题和text ='你好吗'

Question(3, 'How are you')

然后我将此问题与具有id = 5的轮询相关联,并在合成表中使用插入,从而导致在合成表中创建此记录

Composition(5, 3)

在此插入之后,触发器应增加poll表中poll_id = 5的number_of_questions。

实际上,当我尝试在Composition上插入时,它会失败(没有添加新记录)而且我得到了

ERROR: FROM element in table "composition" is missing

触发器有什么问题?

1 个答案:

答案 0 :(得分:0)

不要尝试在触发器中使用合成表,当前合成的记录是变量" NEW"。所以在你的触发器中替换:

     UPDATE poll SET number_of_questions = number_of_questions + 1 WHERE poll.id = composition.poll;

by:

   UPDATE poll SET number_of_questions = number_of_questions + 1 WHERE poll.id = NEW.poll;