我在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)
,查询效果很好。
我有点困惑。
提前致谢。
答案 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_id
与set = sort_id
然后在你的
上INSERT INTO vtiger_role2picklist (roleid,picklistvalueid,picklistid,sortid) VALUES ('H5',@pickvalue,47,@sort_id);
您正在使用@sortid而不是您的sort_id变量,该变量没有先前设置的值。