我在mysql数据库中有两个表:“users”和“subscription”,在“users”表中,每个用户都有一个subscriptionid,它是“subscriptions”中一行的id或null。我需要在“users”上创建一个update触发器,该触发器删除“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-无法更新存储函数/触发器中的表“subscriptions”,因为它已由调用此存储函数/触发器的语句使用。
(我知道这个问题对于 (select * from (select ..) as c)
,但这是为了解决另一个问题,在这个问题中,我无法更新'users'表,因为它在子查询中使用,方法是创建一个alias/temp表)
我不明白是什么问题,因为触发器是从“users”表调用的,而删除是在“subscriptions”中进行的??
更新:我很确定问题是由事件的查询引起的,而不是触发器本身,因为我用那个简单的查询进行了测试 'UPDATE users SET SubscriptionID = null WHERE UserID = 24
触发器正确无误地执行。。。
谢谢!
1条答案
按热度按时间kwvwclae1#
这是mysql中的一个文档限制。
引用表的sql语句
subscriptions
正在触发触发器。因此不允许触发器修改
subscriptions
table。如果触发器试图将更改应用于
subscriptions
表中,mysql引发错误。mysql参考手册中记录了这个限制。