0

ユーザー情報を保持するusersテーブルがあり、その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-従業員または略してee2-雇用者またはer3-両方のタイプ

ステータスフィールドは:0:禁止、非アクティブ1:アクティブ

今私はトリガーを持っており、それはユーザーカウンターを処理しています

(雇用者の場合はee_counter [type:1,3]、雇用者の場合はer_counter [type: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を更新するとすべてのページで

更新前に使用しようとしましたが、このエラーが発生しても機能しないとの指摘がありました。

4

1 に答える 1

0

UPDATEこのエラーは、トリガー内の最後のクエリの一部が原因であると思いますが、とにかく無意味です。

クエリのこの部分が原因で、エラーメッセージが不平を言っています。

JOIN users u
  ON o.user_id = u.id

...JOINトリガーがアタッチされているテーブルをトリガーUPDATE内のクエリに編集しました。MySQLは、これが再帰を引き起こす可能性があることを正しく検出し、エラーをスローします。

ただし、クエリのその部分を簡単に削除できるはずです。エイリアスuはどこにも使用されていないため、JOIN不要です。これで問題は解決すると思います。

于 2012-04-24T15:05:02.133 に答える