现在执行一个sql报错,sql如下:
update mon_agent SET car_count = car_count+1 where 1=2 or FIND_IN_SET(agent_id,getParAgentList(1));
说明:getParAgentList是个存储过程,里面会查询mon_agent表,具体定义如下:
CREATE DEFINER = gpsman@% FUNCTION tpss-release.getParAgentList(agentId int(11)) RETURNS varchar(21845)
READS SQL DATA
BEGIN
DECLARE fid varchar(100) default ‘’;
DECLARE str varchar(1000) default agentId;
WHILE agentId is not null do
SET fid =(SELECT parent_id FROM mon_agent where is_delete=0 and agent_id = agentId);
IF fid is not null THEN
SET str = concat(str, ',', fid);
SET agentId = fid;
ELSE
SET agentId = fid;
END IF;
END WHILE;
return str;
END
报错如下:
SQL 错误 [1442] [HY000]: Can’t update table ‘mon_agent’ in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
改为异步处理
将“更新表”的逻辑放到触发器外部,由应用层或异步任务完成。
使用中间表
触发器写入中间表,后续再更新原表,避免在触发器内操作相同表。
改写触发器逻辑
如果是简单自更新(比如 UPDATE mon_agent SET col=val WHERE id=NEW.id),很多场景可以直接在 BEFORE UPDATE 中用 SET NEW.col=val 实现,避免显式 UPDATE 语句。