我在 MySQL 数据库中有两个表:“users”表中的“users”和“subscription”,每个用户都有一个 subscriptionID,它是“subscriptions”中一行的 ID 或 NULL。我需要在“用户”上创建一个更新触发器,以删除“订阅”中将订阅 ID 的新值设置为空的行。
这是我的触发器:
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)
.
我不明白问题是什么,因为触发器是从“用户”表中调用的,而删除是在“订阅”中进行的??
更新:我很确定问题是由事件的查询而不是触发器本身引起的,因为我用那个简单的查询进行了测试,'UPDATE users SET SubscriptionID = null WHERE UserID = 24
并且触发器正确执行而没有错误......
非常感谢 !