Как обновить, основываясь на отсутствии в другой таблице в mysql?

#mysql #sql #mariadb

Вопрос:

Это сервер базы данных, который я использую:

Тип сервера: MariaDB

Подключение к серверу: SSL не используется

Версия сервера: 10.5.8-MariaDB — Сервер MariaDB

Версия протокола: 10

У меня есть таблица пользователей, одно из значений — «isGroupLeader».

Другая таблица-это Группы, в которых у групп есть лидеры.

Один пользователь может быть членом нескольких групп.

Когда я меняю лидера, я хочу проверить, является ли старый лидер все еще лидером в другой группе или нет. Если он не является лидером в другой группе, то я установлю для его isGroupLeader значение false.

Также в псевдокоде:

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

Как мне это сделать в запросе MySQL MariaDB?

Ответ №1:

Вы можете поддерживать состояние isGroupLeader столбца в users таблице с помощью триггеров on INSERT UPDATE и DELETE into groups . На вставке установите isGroupLeader флаг groupLeader в значение true. При обновлении вам нужно установить флаг нового 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
 

Демонстрация на dbfiddle

Комментарии:

1. @Coder88 Это ответ на ваш вопрос? Если нет, не могли бы вы предоставить дополнительную информацию, чтобы помочь ответить на этот вопрос?

2. спасибо, что уделили мне время, но я еще не проверял это. Я думаю, что смогу понять это из вашего ответа.

3. @Coder88 не беспокойтесь, я просто хотел узнать, не нужна ли вам еще какая-нибудь помощь. Вы не должны соглашаться, пока не пройдете тестирование.