我有一个用户表,它保存了用户的信息,它的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-员工或ee简称2-雇主或er3-两种类型
状态字段为:0:禁止,非活动1:活动
现在我有了触发器,它可以处理用户计数器
(雇员类型的ee_counter:1,3,雇主类型的er_counter :2,3)
在stats表中,当用户更改其状态(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时,在每个页面上
我尝试在更新之前使用,因为有些人建议它不能工作,仍然得到这个错误
发布于 2012-04-24 23:05:02
我认为这个错误是由触发器中最后一个UPDATE查询的一部分引起的,该查询无论如何都是没有意义的。
由于查询的这一部分,错误消息是报错的:
JOIN users u
ON o.user_id = u.id...you已将触发器附加到的表JOIN到触发器内的UPDATE查询上。MySQL正确地发现这可能导致递归,并抛出错误。
但是,您应该能够简单地删除查询的这一部分。别名u不在任何地方使用,因此JOIN是不必要的。我认为这会解决这个问题。
https://stackoverflow.com/questions/10298552
复制相似问题