在另一个 table 中更新后从 table 中删除会导致 mysql 中出现错误

Delete from a table after update in another table causes an error in mysql

我在一个MySQL数据库中有两个table:'users'和'subscription'在table'users'中,每个用户都有一个subscriptionID 是 'subscriptions' 或 NULL 中行的 ID。我需要在 'users' 上创建一个更新触发器,删除 'subscriptions' 中 subscriptionID 的新值设置为 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 - 无法更新存储的 function/trigger 中的 table 'subscriptions' 因为它已被调用此存储的语句使用function/trigger.

(I know that the query is strange with the (select * from (select ..) as c), but that was to fix another problem where i couldn't update the 'users' table because it was used in the subquery, by creating a alias / temp table)

我不明白问题是什么,因为触发器是从 'users' table 调用的,而删除是在 'subscriptions' 中进行的 ??

更新:我很确定问题是由事件的查询而不是触发器本身引起的,因为我用那个简单的查询 'UPDATE users SET SubscriptionID = null WHERE UserID = 24 进行了测试并且触发器正确执行没有错误...

非常感谢!

这是 MySQL 中记录的限制。

引用 table subscriptions 的 SQL 语句导致触发触发器。

所以触发器不允许修改subscriptionstable的内容。

如果触发器尝试将更改应用于 subscriptions table,MySQL 会引发错误。

此限制记录在 MySQL 参考手册中。