0

我在 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并且触发器正确执行而没有错误......

非常感谢 !

4

1 回答 1

0

这是 MySQL 中记录的限制。

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

所以触发器是不允许修改subscriptions表的内容的。

如果触发器尝试对subscriptions表应用更改,MySQL 会引发错误。

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

于 2018-07-06T15:32:45.637 回答