【问题标题】:How to update based on not existence in another table in mysql?如何根据不存在于mysql的另一个表中进行更新?
【发布时间】:2021-03-18 22:31:58
【问题描述】:

这是我使用的数据库服务器:

服务器类型:MariaDB

服务器连接:未使用 SSL

服务器版本:10.5.8-MariaDB - MariaDB 服务器

协议版本:10

我有一个用户表,其中一个值是“isGroupLeader”。

另一个表是 Groups,其中 Groups 有领导者。

一个用户可以是多个组的梯级。

当我更换组长时,我想检查旧组长是否仍然是另一个组的组长。 如果他不是其他组的leader,那么我将他的isGroupLeader设置为false。

还有伪代码:

if (TheUser.userID is NOT in (groupLeader column of Groups table)) {
   TheUser.isGroupLeader = false;
}

如何在 MySQL 查询 MariaDB 中做到这一点?

【问题讨论】:

    标签: mysql sql mariadb


    【解决方案1】:

    您可以使用INSERTUPDATEDELETE 上的触发器将users 表中的isGroupLeader 列的状态维护到groups。在插入时,将groupLeaderisGroupLeader 标志设置为true。更新时,您需要设置新groupLeader 值的标志,并可能清除(如果他们不是另一个组的组长)旧groupLeader 值的标志。删除时,如果用户不再是任何组的领导者,请清除用户的 isGroupLeader 标志。请注意UPDATEDELETE 触发器必须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
    

    Demo on dbfiddle

    【讨论】:

    • @Coder88 这回答了你的问题吗?如果没有,您能否提供更多信息来帮助回答?
    • 感谢您的宝贵时间,但我还没有测试过。我想我可以从你的回答中弄清楚。
    • @Coder88 不用担心,我只是想看看您是否需要更多帮助。在你测试之前你不应该接受。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-05
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多