2012-04-24 20 views
0

我有一個用戶表,它保持用戶信息,它的last_activity列在每次用戶看到一個頁面時都得到更新。不能更新表存儲的觸發器,它已經被調用此存儲函數/觸發器的語句使用

public function set_last_activity(){ 
    global $db; 
    $t = time(); 
    $sql = "UPDATE `users` SET `last_activity` = '$t' 
    WHERE 
    `id` = '$this->id' "; 
    $db->query($sql); 
    } 

每個用戶可以有3種類型的 1 - 爲短 2僱員或EE - 僱主或呃 3 - 這兩種類型的

和狀態字段是: 0:禁止,不活躍 1 :活性

現在我有觸發和它處理用戶計數器

(ee_counter爲聘用過的員工[類型:1,3],對於er_counter僱用ER [類型:2,3]中的統計信息表)

當用戶改變它的狀態(0:禁止,1:有效),並且還更新它特色的情況下應對用戶是僱工

DELIMITER $$ 
CREATE TRIGGER user_status_change 
    AFTER UPDATE 
    ON users 
    FOR EACH ROW 
BEGIN 
    UPDATE stats s 

SET 

    ee_counter = 
     CASE 

     WHEN (NEW.type= 1 || NEW.type= 3) && OLD.status !=1 && NEW.status = 1 THEN ee_counter + 1 
     WHEN (NEW.type= 1 || NEW.type= 3) && OLD.status = 1 && NEW.status != 1 THEN ee_counter - 1 

     WHEN NEW.type= 3 && OLD.type = 2 THEN ee_counter + 1 
     WHEN OLD.type= 1 && NEW.type = 2 THEN ee_counter - 1 
     ELSE ee_counter 
     END , 

    er_counter = 
     CASE 
     WHEN (NEW.type= 2 || NEW.type= 3) && OLD.status !=1 && NEW.status = 1 THEN er_counter + 1 
     WHEN (NEW.type= 2 || NEW.type= 3) && OLD.status = 1 && NEW.status != 1 THEN er_counter - 1 

     WHEN NEW.type= 3 && OLD.type = 1 THEN er_counter + 1 
     WHEN OLD.type= 2 && NEW.type = 1 THEN er_counter - 1 
     ELSE er_counter 
     END 

    WHERE 
    s.id = 1; 


    UPDATE specialitys s 
JOIN speciality_objects o 
     ON s.id = o.speciality_id 
    JOIN users u 
     ON o.user_id = u.id 
SET 
    counter = 
     CASE 
     WHEN NEW.status = 1 && OLD.status !=1 THEN counter + 1 
     WHEN NEW.status != 1 && OLD.status = 1 THEN counter - 1 
     ELSE counter 
     END 

    WHERE 
    o.user_id = NEW.id && s.id = o.speciality_id ; 

END $$ 

DELIMITER ; 

它使用,直到我改變了我的主機正常工作,買了VPS

沒有我不斷收到此錯誤

Database query failed: Can't update table 'users' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 

在每一頁上,當我更新last_activity

我試圖BEFORE UPDATE使用一些曾建議沒有奏效仍然收到此錯誤

回答

0

我覺得這個錯誤是由是沒有意義的反正觸發器中的最後UPDATE查詢的一部分引起的。

的錯誤消息,因爲查詢的這部分抱怨:

JOIN users u 
    ON o.user_id = u.id 

...你JOIN編觸發器附加到,到觸發器中的UPDATE查詢表。 MySQL正確地發現這可能會導致遞歸併拋出錯誤。

但是,您應該能夠簡單地刪除該部分查詢。別名u不在任何地方使用,所以JOIN是不必要的。我認爲這將解決問題。

相關問題