2

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

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个条目,所以对它的查询并不是微不足道的)?关于这个主题的其他问题是使用连接解决的,但我认为这不适用于这里。

4

2 回答 2

2
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
于 2012-09-12T00:08:38.437 回答
0

您可以稍微不同地表达 WHERE 子句:

UPDATE newtbl
SET subtree_count = subtree_count + 1
WHERE (SELECT lft FROM newtbl WHERE taxon_id = NEW.taxon_id) between lft and rgt
于 2012-09-12T02:02:49.127 回答