mysql - 如何根据不存在于mysql的另一个表中进行更新?
问题描述
这是我使用的数据库服务器:
服务器类型:MariaDB
服务器连接:未使用 SSL
服务器版本:10.5.8-MariaDB - MariaDB 服务器
协议版本:10
我有一个用户表,其中一个值是“isGroupLeader”。
另一个表是 Groups,其中 Groups 有领导者。
一个用户可以是多个组的梯子。
当我更换领导时,我想检查旧领导是否仍然是另一个组的领导。如果他不是另一个组的领导者,那么我会将他的 isGroupLeader 设置为 false。
同样在伪代码中:
if (TheUser.userID is NOT in (groupLeader column of Groups table)) {
TheUser.isGroupLeader = false;
}
如何在 MySQL 查询 MariaDB 中执行此操作?
解决方案
您可以使用触发器 on和into来维护表中列isGroupLeader
的状态。在插入时,将 的标志设置为 true。在更新时,您需要设置新值的标志,并可能清除(如果他们不是另一个组的组长)旧值的标志。删除时,如果用户不再是任何组的领导者,则清除用户的标志。请注意,and触发器必须在之后运行,以确保该子句与正在更新或删除的行不匹配。users
INSERT
UPDATE
DELETE
groups
isGroupLeader
groupLeader
groupLeader
groupLeader
isGroupLeader
UPDATE
DELETE
UPDATE/DELETE
EXISTS
CREATE TRIGGER addLeader AFTER INSERT ON groups
FOR EACH ROW
BEGIN
UPDATE users
SET isGroupLeader = true
WHERE userID = NEW.groupLeader;
END
CREATE TRIGGER updateLeader AFTER UPDATE ON groups
FOR EACH ROW
BEGIN
UPDATE users
SET isGroupLeader = userID = NEW.groupLeader
OR EXISTS (SELECT * FROM groups WHERE groupLeader = OLD.groupLeader)
WHERE userID IN(OLD.groupLeader, NEW.groupLeader);
END
CREATE TRIGGER deleteLeader AFTER DELETE ON groups
FOR EACH ROW
BEGIN
UPDATE users
SET isGroupLeader = EXISTS (SELECT * FROM groups WHERE groupLeader = OLD.groupLeader)
WHERE userID = OLD.groupLeader;
END