2015-06-10 23 views
0

我有在phpMyAdmin創建,就像一個觸發器:的Mysql#1235錯誤代碼,當創建2個觸發器不同用途

BEGIN 
UPDATE bands SET 
bands.status = "active" 
where bands.id IN(
SELECT * FROM 
(select bands.id 
from bands where bands.id IN 
(select bandId from invites join bands 
on(invites.bandId = bands.id) 
where invites.status="approved" 
group by bandId having count(invites.status)=bands.total_personel))AS X); 
end 

該觸發器將改變我的樂隊爲活動狀態。

但是我想自動更改狀態爲「不活動」,如果它不符合where子句。

如果我創建另一個觸發條件:

BEGIN 
UPDATE bands SET 
bands.status = "inactive" 
where bands.id IN(
SELECT * FROM 
(select bands.id 
from bands where bands.id IN 
(select bandId from invites join bands 
on(invites.bandId < bands.id) 
where invites.status="approved" 
group by bandId having count(invites.status)=bands.total_personel))AS X); 
end 

MySQL允許我#1235錯誤代碼。

我該如何解決這個問題?還是有辦法在一個觸發器中結合這些目的?

回答

0

我找到了答案。我之前不知道UPDATE命令可以和WHEN條件結合使用。

下面的代碼:

BEGIN 
UPDATE bands SET status = CASE 
WHEN bands.id IN 
(SELECT * FROM 
(select bands.id from bands where bands.id IN 
(select bandId from invites join bands 
on(invites.bandId = bands.id) 
where invites.status="approved" 
group by bandId having count(invites.status)=bands.total_personel))AS X) 
then "active" 
ELSE "inactive" 
END 
WHERE bands.id in (select distinct invites.bandId from invites); 
END 

,MySQL的代碼更改狀態,以積極的,如果滿足條件時,並自動更改的狀態設置爲無效,如果它不符合WHEN條件。

+1

我相信你在這個觸發器中犯了一個錯誤,你會在稍後發現,一旦你有更多的數據。您正在更新與「更新觸發觸發器」的行無關的「波段」中的行。 MySQL中的觸發器每行觸發一次*,並且該行可作爲稱爲NEW和OLD的特殊僞表訪問。你應該可以在NEW.bandId上匹配。否則這個觸發器會隨着時間的推移變慢 –