我在MySQL数据库中有两个表:“users”表中的“users”和“subscription”,每个用户都有一个subscriptionID,它是“subscriptions”中一行的ID或NULL。我需要在“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 - 无法更新存储函数/触发器中的表“订阅”,因为它已被调用此存储函数/触发器的语句使用。
(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)
我不明白问题是什么,因为触发器是从“用户”表调用的,并且删除是在“订阅”中进行的?
更新:我很确定问题是由事件的查询引起的,而不是触发器本身引起的,因为我用这个简单的查询进行了测试'UPDATE users SET SubscriptionID = null WHERE UserID = 24
并且触发器正确执行,没有错误...
非常感谢!
最佳答案
这是 MySQL 中记录的限制。
引用表 subscriptions
的 SQL 语句导致触发触发器。
因此触发器不允许修改subscriptions
表的内容。
如果触发器尝试对 subscriptions
表应用更改,MySQL 会引发错误。
MySQL 引用手册中记录了此限制。
关于mysql - 更新另一个表后从一个表中删除会导致mysql出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51213248/