2012-09-21 91 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