我有一个表用户 在其中有列 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
答案 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;
这将获得用户积分的状态,并验证他是否已经在该级别。如果没有,用户将改变状态。