在另一个 table 中更新后从 table 中删除会导致 mysql 中出现错误
Delete from a table after update in another table causes an error in mysql
我在一个MySQL数据库中有两个table:'users'和'subscription'在table'users'中,每个用户都有一个subscriptionID 是 'subscriptions' 或 NULL 中行的 ID。我需要在 '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 - 无法更新存储的 function/trigger 中的 table 'subscriptions' 因为它已被调用此存储的语句使用function/trigger.
(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)
我不明白问题是什么,因为触发器是从 'users' table 调用的,而删除是在 'subscriptions' 中进行的 ??
更新:我很确定问题是由事件的查询而不是触发器本身引起的,因为我用那个简单的查询 'UPDATE users SET SubscriptionID = null WHERE UserID = 24
进行了测试并且触发器正确执行没有错误...
非常感谢!
这是 MySQL 中记录的限制。
引用 table subscriptions
的 SQL 语句导致触发触发器。
所以触发器不允许修改subscriptions
table的内容。
如果触发器尝试将更改应用于 subscriptions
table,MySQL 会引发错误。
此限制记录在 MySQL 参考手册中。
我在一个MySQL数据库中有两个table:'users'和'subscription'在table'users'中,每个用户都有一个subscriptionID 是 'subscriptions' 或 NULL 中行的 ID。我需要在 '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 - 无法更新存储的 function/trigger 中的 table 'subscriptions' 因为它已被调用此存储的语句使用function/trigger.
(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)
我不明白问题是什么,因为触发器是从 'users' table 调用的,而删除是在 'subscriptions' 中进行的 ??
更新:我很确定问题是由事件的查询而不是触发器本身引起的,因为我用那个简单的查询 'UPDATE users SET SubscriptionID = null WHERE UserID = 24
进行了测试并且触发器正确执行没有错误...
非常感谢!
这是 MySQL 中记录的限制。
引用 table subscriptions
的 SQL 语句导致触发触发器。
所以触发器不允许修改subscriptions
table的内容。
如果触发器尝试将更改应用于 subscriptions
table,MySQL 会引发错误。
此限制记录在 MySQL 参考手册中。