我正在创建一个触发器,以便在另一个表中插入行时更新一个表。在这个update语句中,我需要从第一个表中选择一个值。然后,我需要在update语句中的两个位置使用此选定值。这是我现在的触发器语句:

CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id)
    AND rgt >= (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id);

这很好用,但不是很优雅(我不需要告诉你“newtbl”不是一个好名字,因为我没能做到)。显然,我希望子查询只运行一次,保存值并使用两次。如果这是一种编程语言,我会定义一个变量。
有办法做我想做的事吗?这真的是一个问题吗(请注意,“newtbl”有超过150万个条目,所以对它的查询不是无关紧要的)?关于这个主题的其他问题都是使用连接解决的,但我不认为这适用于这里。

最佳答案

CREATE TRIGGER rsrcInsTrig AFTER INSERT ON jos_resources
FOR EACH ROW BEGIN
    DECLARE tmplft INT DEFAULT 0; -- assuming it really is an INT
    SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id INTO tmplft;
    UPDATE newtbl
    SET subtree_count = subtree_count + 1
    WHERE lft <= tmplft
    AND rgt >= tmplft;
END

10-04 11:52