【问题标题】:#1442 - Can't update table '*' in stored function/trigger because it is already used by statement which invoked this stored function/trigger#1442 - 无法更新存储函数/触发器中的表“*”,因为它已被调用此存储函数/触发器的语句使用
【发布时间】:2017-05-23 02:35:33
【问题描述】:

我真的不擅长 SQL,但我正在努力使我的数据库尽可能简单和简约。不是重复值,而是使用引用和 id。

现在插入查询后出现错误

1442 - 无法更新存储函数/触发器中的“已签名”表,因为它已被调用此存储函数/触发器的语句使用

当触发器被禁用时可以插入查询。但是我的查询只是从表'users'中读取,所以不应该有冲突。我读了一些关于死锁的东西——查询在使用它或类似的东西时锁定了表,因此触发器不能更新一行?想法我怎么能做到这一点?

我简化了我的查询,所以只有重要的东西在那里。

查询:

INSERT INTO signed (time_of_start, player)
    SELECT time_of_game_id, users.user_id 
    FROM time_of_game, users
    WHERE time_of_game.time_of_start = "2017-02-01 12:00:00"
      AND users.steamid = "1234567890123456";

触发器:

CREATE TRIGGER `payment_for_joining` 
AFTER INSERT ON `signed`
FOR EACH ROW 
    UPDATE users  
    SET users.credit = users.credit-1
    WHERE users.user_id = NEW.player

【问题讨论】:

    标签: mysql triggers mysql-error-1442


    【解决方案1】:

    它不允许您更新表,因为它已被调用此触发器的 INSERT INTO.. SELECT 查询读取。

    另一种方法是禁用触发器并单独更新用户表,例如:

    INSERT INTO signed (time_of_start, player)
    SELECT time_of_game_id, users.user_id FROM time_of_game, users
    WHERE time_of_game.time_of_start="2017-02-01 12:00:00"
    AND users.steamid="1234567890123456";
    
    UPDATE users join time_of_game SET users.credit = users.credit-1
    where time_of_game.time_of_start="2017-02-01 12:00:00"
    AND users.steamid="1234567890123456";
    

    如果存在链接这两个表的任何列,您可以使用ON 子句添加连接列。

    【讨论】:

    • 是的,我只是希望我可以只用一个请求/查询来完成这 2 个操作。但我会从更有经验的程序员那里得到一个提示,我使用你的解决方案:) 谢谢
    猜你喜欢
    • 2023-01-19
    • 1970-01-01
    • 2019-08-05
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2017-08-11
    • 2013-02-24
    相关资源
    最近更新 更多