首页 > 解决方案 > 如何根据不存在于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 中执行此操作?

标签: mysqlsqlmariadb

解决方案


您可以使用触发器 on和into来维护表中列isGroupLeader的状态。在插入时,将 的标志设置为 true。在更新时,您需要设置新值的标志,并可能清除(如果他们不是另一个组的组长)旧值的标志。删除时,如果用户不再是任何组的领导者,则清除用户的标志。请注意,and触发器必须在之后运行,以确保该子句与正在更新或删除的行不匹配。usersINSERTUPDATEDELETEgroupsisGroupLeadergroupLeadergroupLeadergroupLeaderisGroupLeaderUPDATEDELETEUPDATE/DELETEEXISTS

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

dbfiddle 上的演示


推荐阅读