首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法更新表存储的触发器,它已被调用此存储函数/触发器的语句使用

问无法更新表存储的触发器,它已被调用此存储函数/触发器的语句使用
EN

Stack Overflow用户
提问于 2012-04-24 21:12:33
回答 1查看 1.3K关注 0票数 0

我有一个用户表,它保存了用户的信息,它的last_activity列在用户每次看到页面时都会更新。

代码语言:javascript
复制
   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-员工或ee简称2-雇主或er3-两种类型

状态字段为:0:禁止,非活动1:活动

现在我有了触发器,它可以处理用户计数器

(雇员类型的ee_counter:1,3,雇主类型的er_counter :2,3)

在stats表中,当用户更改其状态(0 :禁止,1:活动)时,它还会在用户正在使用情况下更新专业计数器

代码语言:javascript
复制
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

不,我一直收到这个错误

代码语言:javascript
复制
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时,在每个页面上

我尝试在更新之前使用,因为有些人建议它不能工作,仍然得到这个错误

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-24 23:05:02

我认为这个错误是由触发器中最后一个UPDATE查询的一部分引起的,该查询无论如何都是没有意义的。

由于查询的这一部分,错误消息是报错的:

代码语言:javascript
复制
JOIN users u
  ON o.user_id = u.id

...you已将触发器附加到的表JOIN到触发器内的UPDATE查询上。MySQL正确地发现这可能导致递归,并抛出错误。

但是,您应该能够简单地删除查询的这一部分。别名u不在任何地方使用,因此JOIN是不必要的。我认为这会解决这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10298552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档