2012-09-21 155 views
0

我想根据任务表中的任务状态更新列表表中的列表状态,两个表都有listid作为通用字段 如果所有taskid任务状态为1,则更改列表状态为1 如果所有taskid taskstatus不是1,则将列表状态更改为0 下面是触发器。 我得到的SQL了Syntex错误,请让我知道什么是错插入触发器更新值后的mysql触发器

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// 
+0

从隔离问题开始。尝试用SELECT 1替换UPDATE语句,看看是否仍然有错误。它可能在DDL/TRIGGER中,它可能在DML中。 –

+0

为什么列表有一个taskid?该任务是否应该有一个listid? – iouri

回答

0

我会得到的该列表中的所有任务的数量和任务状态的总和减去它(如果1和0是唯一状态),然后将1加到结果中,然后在更新语句中使用GREATEST(result,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。就像我在评论中所说的,taskid在列表中没有意义。

+0

我收到以下错误#1064 - 您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在靠近'SELECT SUM(taskstatus)-count(*)+ 1的地方使用正确的语法,其中listid = new.listid,0)其中'在第2行 – user1662799

+0

CREATE TRIGGER update_list_status在插入之后tada.task FOR EACH ROW BEGIN UPDATE list set liststatus = GREATEST(SELECT SUM(taskstatus)-count(*)+ 1 from listid = new.listid,0)其中listid = new.listid; END – user1662799

+0

将内部选择放入()中。 GREATEST((SELECT SUM(taskstatus)-count(*)+ 1 from listid = new.listid),0) – iouri