#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
Комментарии:
1. @Coder88 Это ответ на ваш вопрос? Если нет, не могли бы вы предоставить дополнительную информацию, чтобы помочь ответить на этот вопрос?
2. спасибо, что уделили мне время, но я еще не проверял это. Я думаю, что смогу понять это из вашего ответа.
3. @Coder88 не беспокойтесь, я просто хотел узнать, не нужна ли вам еще какая-нибудь помощь. Вы не должны соглашаться, пока не пройдете тестирование.