mysql - 更新另一个表后从一个表中删除会导致mysql出错

标签 mysql sql triggers sql-delete mysql-error-1442

我在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/

相关文章:

MySQL sql转储错误的字符编码

java - 如何从 Mysql 表中选择可转义字符

Mysql:在一个流程中 INSERT 上的过程 + 触发器

JQuery 自动完成列表消失

mysql4 缺少 auto_increment id

mysql - 如何返回列中连续行与其他数据的差异 (mySQL)

MySQL 查询 : add values from db1. table1 到 db2.table1

sql - 禁用主键并在 SQL 批量插入后重新启用

sql - 什么时候不应该使用关系数据库?

google-apps-script - 无法使用 Apps 脚本在电子表格副本的 onOpen 函数中打开模式对话框