MySQL Select语句在Trigger内部返回null

时间:2011-07-04 14:19:28

标签: mysql triggers

我在MySQL中创建了一个触发器但是有一个小问题。

这是触发器代码:

DELIMITER $$
DROP TRIGGER IF EXISTS cfmaj$$
CREATE TRIGGER cfmaj AFTER INSERT ON vtiger_cf_608
FOR EACH ROW
BEGIN
DECLARE sortid,pickvalue INT;
SET @pickvalue = (SELECT id FROM vtiger_picklistvalues_seq),
@sort_id = (SELECT max(sortid) FROM vtiger_role2picklist WHERE roleid = 'H5' AND picklistid = 47); 
UPDATE vtiger_cf_608_seq SET id = id+1;
UPDATE vtiger_picklistvalues_seq SET id = id+1;
INSERT INTO vtiger_role2picklist (roleid,picklistvalueid,picklistid,sortid) VALUES ('H5',@pickvalue,47,@sort_id);
END;
$$
DELIMITER ;

除了@sort_id等于null之外,一切正常。有趣的是,只用

查询
  

(SELECT max(sortid)FROM vtiger_role2picklist WHERE roleid ='H5'AND picklistid = 47)

,查询效果很好。

我有点困惑。

提前致谢。

3 个答案:

答案 0 :(得分:1)

你不应该使用@var := value吗? :=使其成为一个赋值,否则MySQL将其解释为相等测试。

答案 1 :(得分:0)

我不是sql的专家,但也许是因为你没有使用SELECT max(sortid) AS xxx

如果不起作用,请尝试执行SELECT ... INTO

DECLARE var_sort_id INT;

SELECT MAX(sortid) AS maxsortid INTO var_sort_id FROM vtiger_role2picklist WHERE roleid = 'H5' AND picklistid = 47;

希望它有效。

编辑:为什么不将每个查询分开,例如:

SET pickvalue = (SELECT id FROM vtiger_picklistvalues_seq);
SET sort_id = (SELECT max(sortid) FROM vtiger_role2picklist WHERE roleid = 'H5' AND picklistid = 47);

答案 2 :(得分:0)

你正在使用

SET @pickvalue = (SELECT id FROM vtiger_picklistvalues_seq),
@sort_id = (SELECT max(sortid) FROM vtiger_role2picklist WHERE roleid = 'H5' AND picklistid = 47); 

而不是

SET pickvalue = (SELECT id FROM vtiger_picklistvalues_seq),
sort_id = (SELECT max(sortid) FROM vtiger_role2picklist WHERE roleid = 'H5' AND picklistid = 47); 

考虑到这一点     set = @sort_idset = sort_id

完全不同

然后在你的

INSERT INTO vtiger_role2picklist (roleid,picklistvalueid,picklistid,sortid) VALUES ('H5',@pickvalue,47,@sort_id);

您正在使用@sortid而不是您的sort_id变量,该变量没有先前设置的值。