mysql触发器在达到一定量的点后更改用户状态

时间:2013-10-27 16:34:09

标签: mysql sql triggers

我有一个表用户 在其中有列 userPoints和userStatus

每个用户都是以新手开始的。 如果userPoints达到100 用户状态应更改为其他内容

还有另一个表userStatuses statusId statusName minPoints maxPoints

根据userStatuses表,我可以创建一个触发器,当userPoints达到100,其userStatus更改时会触发吗?

表状态

id  statusName  minimumPoints   maximumPoints

1   lvl1            0               100
2   lvl2            101             1000
3   lvl3            1001            5000
4   lvl4            5001            20000
5   lvl5            20000           100000

2 个答案:

答案 0 :(得分:1)

试试这个:

delimiter //
CREATE TRIGGER changeUserStatus BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
     IF NEW.userPoints > 100 THEN
         SET NEW.userStatus = 'lvl2';
     END IF;
END;//
delimiter ;

delimiter允许在触发器定义中使用分号。

当然,假设你硬编码。如果您想要引用表,我会使用不同的方法。

编辑:如果您想引用您的表statuses(您在编辑后的问题中提供),那么您的方法取决于您要更新的记录数。

如果您一次更新一个,

delimiter //
CREATE TRIGGER changeUserStatus BEFORE UPDATE ON users
FOR EACH ROW
BEGIN
     SET @status = (
         SELECT statusName
         FROM statuses
         WHERE NEW.userPoints BETWEEN s.minimumPoints AND s.maximumPoints
     );
     IF @status <> NEW.userStatus:
         SET NEW.userStatus = @status;
     END IF;
END;//
delimiter ;

但是,如果您一次更新许多记录,则最终运行一个查询可能会更高效。不幸的是,MySQL只允许每行执行一次操作的触发器。

所以,我会创建一个存储过程

CREATE PROCEDURE refreshUserStatuses
     UPDATE users u
         JOIN statues s ON u.userPoints BETWEEN s.minimumPoints AND s.maximumPoints
     SET u.userStatus = s.statusName;

更新用户后,您必须运行CALL refreshUserStatuses;

答案 1 :(得分:1)

你可以这样做:

CREATE TRIGGER update_status BEFORE UPDATE ON users
FOR EACH ROW
  BEGIN
    SET @NEWSTATUS = (SELECT statusId 
                      FROM userStatuses 
                      WHERE NEW.userPoints BETWEEN minPoints AND maxPoints);
      IF @NEWSTATUS != OLD.userStatus THEN
        SET NEW.userStatus = @NEWSTATUS;    
      END IF;
  END;

这将获得用户积分的状态,并验证他是否已经在该级别。如果没有,用户将改变状态。

sqlfiddle demo