我有一个用户表,用于保存用户信息,并且每次用户看到页面时,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 - 雇主或呃 3 - 两种类型
和状态字段是: 0:禁止,不活跃 1:有效
现在我有触发器,它处理用户计数器
(雇主的ee_counter [类型:1,3],雇主的er_counter [类型: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 :(得分:0)
我认为这个错误是由触发器中最后一个UPDATE
查询的一部分造成的,无论如何都是毫无意义的。
由于查询的这一部分,错误消息正在抱怨:
JOIN users u
ON o.user_id = u.id
...您已将触发器附加到的表JOIN
放到触发器内的UPDATE
查询中。 MySQL正确地发现这可能导致递归,并引发错误。
但是,您应该能够简单地删除该部分查询。别名u
未在任何地方使用,因此JOIN
是不必要的。我认为这将解决问题。