Удалить из таблицы после обновления в другой таблице вызывает ошибку в MySQL

0

У меня есть две таблицы в базе данных 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 и триггер правильно выполнен без ошибок...

Большое спасибо !

  • 0
    Образцы данных и желаемые результаты действительно помогут.
  • 0
    Хорошо, давайте предположим, что у пользователя # 1 есть подписка ID # 5, а у подписки # 5 есть endDate 2018-07-04 16:29:28. Предполагается, что запрос установит 'null' в subscriptionID нашего пользователя # 1 (потому что EndDate <CURRENT_TIMESTAMP) и выполнит триггер, который удалит подписку # 5 из таблицы 'subscription' (потому что мы установили NULL для subscriptionID пользователя # 1 )
Теги:
sql-delete
triggers
mysql-error-1442

1 ответ

0

Это документированное ограничение в MySQL.

Оператор SQL, ссылающийся на subscriptions таблицы, вызывает запуск триггера.

Таким образом, триггер не может изменять содержимое таблицы subscriptions.

Если триггер пытается применить изменение к таблице subscriptions, MySQL вызывает ошибку.

Это ограничение описано в Справочном руководстве по MySQL.

  • 0
    Спасибо ! У вас есть представление о том, что я могу сделать, чтобы добиться того, чего я хочу?
  • 0
    Могу ли я решить эту проблему, создав вместо моего подзапроса представление и временную таблицу?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню