sql—在另一个表中更新后从表中删除会导致mysql中的错误

osh3o9ms  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(308)

我在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 触发器正确无误地执行。。。
谢谢!

kwvwclae

kwvwclae1#

这是mysql中的一个文档限制。
引用表的sql语句 subscriptions 正在触发触发器。
因此不允许触发器修改 subscriptions table。
如果触发器试图将更改应用于 subscriptions 表中,mysql引发错误。
mysql参考手册中记录了这个限制。

相关问题