У меня есть две таблицы в базе данных MySQL: "пользователи" и "подписка" в таблице "пользователи", каждый пользователь имеет идентификатор подписки, который является идентификатором строки в "подписках" или NULL. Мне нужно создать триггер обновления для "пользователей", которые удаляют строки в "подписках", где новое значение идентификатора подписки равно null.
Вот мой триггер:
CREATE TRIGGER 'trg_DeleteSubscriptions' AFTER UPDATE ON 'users'
FOR EACH ROW IF (NEW.subscriptionID <=> NULL) THEN
DELETE FROM subscriptions s WHERE s.subscriptionID = OLD.subscriptionID;
END IF
Нет никаких проблем при создании моего триггера, однако у меня есть рекурсивное событие, которое выполняет этот запрос:
UPDATE users SET AccountState = 2, subscriptionID = null WHERE UserID IN
(SELECT * from (SELECT u.UserID FROM users u INNER JOIN subscriptions a ON
u.subscriptionID = a.subscriptionID WHERE a.EndDate < CURRENT_TIMESTAMP) as c)
и вызывают ошибку: # 1442 - Невозможно обновить "подписки" таблицы в хранимой функции/триггере, потому что она уже используется оператором, который вызывал эту хранимую функцию/триггер.
(Я знаю, что запрос странный с
(select * from (select..) as c)
, но это должно было исправить еще одну проблему, когда я не мог обновить таблицу "users", потому что она была использована в подзапросе, создание таблицы псевдонимов /temp)
Я не понимаю, в чем проблема, поскольку триггер вызывается из таблицы "users", а delete - в "подписях"?
UPDATE: Я уверен, что проблема вызвана запросом события, а не самим триггером, так как я тестировал этот простой запрос. 'UPDATE users SET SubscriptionID = null WHERE UserID = 24
и триггер правильно выполнен без ошибок...
Большое спасибо !
Это документированное ограничение в MySQL.
Оператор SQL, ссылающийся на subscriptions
таблицы, вызывает запуск триггера.
Таким образом, триггер не может изменять содержимое таблицы subscriptions
.
Если триггер пытается применить изменение к таблице subscriptions
, MySQL вызывает ошибку.
Это ограничение описано в Справочном руководстве по MySQL.