我创建了一个触发器,可以在另一个表中插入一行时更新一个表。在此更新语句中,我需要从第一个表中选择一个值。然后我需要在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);
这样做很好,但不是很优雅(我不需要被告知新手不是桌子的好名字;我没有&#39 ;做它)。显然,我希望子查询只运行一次,保存值并使用两次。如果这是一种编程语言,我会定义一个变量。
有没有办法做我想要的?它是否真的是一个问题(注意&#39; newtbl&#39;有超过1.5 百万条目,因此对它的查询并不是无关紧要的)?关于这个主题的其他问题是使用连接解决的,但我不相信这适用于此。
答案 0 :(得分: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
答案 1 :(得分: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