插入触发器更新后的mysql触发器值

时间:2012-09-21 04:20:53

标签: mysql triggers crontrigger

我想根据任务表中的任务状态更新列表中的列表状态,这两个表都是listid作为公共字段 如果所有taskid任务状态均为1,则将列表状态更改为1 如果所有taskid taskstatus都不是1,则将列表状态更改为0 下面是触发器。 我收到sql syntex错误,请告诉我有什么问题

  DROP TRIGGER IF EXISTS tada.list//

  CREATE TRIGGER tada.list
  AFTER INSERT ON tada.task
  FOR EACH ROW
 BEGIN
 UPDATE list t1 , task t2 SET t1.liststatus = t2.taskstatus FROM list t1 , task t2 WHERE t1.taskid = t2.taskid;
 END//

1 个答案:

答案 0 :(得分:0)

我将得到该列表的所有任务的计数,并从任务状态的总和中减去它(如果1和0是您拥有的唯一状态),然后将1加到结果中,然后使用GREATEST(结果,0)在您的更新声明中。

例如,您有10个任务,8个状态为1:

UPDATE list l set status = GREATEST((SELECT SUM(t.status)-count(*)+1 from task t
where t.listid = 100), 0) where l.listid = 100;

这会将其设置为0,因为8-10 + 1 = -1而GREATEST将选择0.如果所有任务都完成,则数学将为10-10 + 1 = 1且GREATEST将使用1.

如果值为1,您可以在触发器中设置条件只更新列表,否则每次插入任务时都会触发更新。

你也应该重命名你的触发器,因为tada.list是没有意义的。

CREATE TRIGGER update_list_status AFTER INSERT ON tada.task
FOR EACH ROW BEGIN
  UPDATE list l set status = GREATEST((SELECT SUM(t.status)-count(*)+1 from task t
  where t.listid = new.listid), 0) where l.listid = new.listid;
END

您可能需要将listid替换为您正在使用的任务和列表所具有的唯一ID。就像我在评论中所说的那样,taskid在列表中没有意义。