2

我有一个表用户,其中有列 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
4

3 回答 3

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

于 2013-10-27T17:00:14.130 回答
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;在更新用户后运行。

于 2013-10-27T16:43:36.097 回答
0

此代码使用户能够更改其密码:

CREATE TABLE users (
  username   VARCHAR(20) NOT NULL UNIQUE,
  First_name VARCHAR(20),
  Last_name  VARCHAR(20),
  password   VARCHAR(20),
  PRIMARY KEY (username)
);

CREATE TABLE change_password (
  id               INT NOT NULL auto_increment,
  username         VARCHAR(20),
  old_password     VARCHAR(20),
  new_password     VARCHAR(20),
  comfirm_password VARCHAR(20),
  PRIMARY KEY (id)
);

DELIMITER $$
create trigger nn before insert on change_password
for each row
begin
if new.comfirm_password!=new.new_password then
signal sqlstate '42000' set message_text="New password is not the same as comfirm password";
end if ;

if (new.old_password != (select password from users where username=new.username))then
signal sqlstate '42000' set message_text="Incorrect old password";
end if ;

if ((new.old_password = (select password from users where username=new.username)) && 
(new.new_password=new.comfirm_password)) then 
update users
set password =new.new_password where username=new.username;
end if;

END $$
DELIMITER ;
于 2019-03-11T20:36:04.400 回答