mySQL触发器在控制台插入后有效,但在脚本插入后无效

0 投票
3 回答
1377 浏览
提问于 2025-04-15 23:14

我遇到了一个关于触发器的问题。

我设置了一个触发器,用来在某个表插入数据后更新其他表。

如果我在MySQL控制台里插入数据,一切都正常,但如果我通过外部的Python脚本插入数据,即使数据是一样的,触发器却没有任何反应,下面就是这个情况。

我尝试把定义者改成'user'@'%'和'root'@'%',但还是没有效果。

mysql> select vid_visit,vid_money from videos where video_id=487;
+-----------+-----------+
| vid_visit | vid_money |
+-----------+-----------+
|        21 |     0.297 |
+-----------+-----------+
1 row in set (0,01 sec)

mysql> INSERT INTO `table`.`validEvents` ( `id` , `campaigns_id` , `video_id` , `date` , `producer_id` , `distributor_id` , `money_producer` , `money_distributor` , `type` ) VALUES ( NULL , '30', '487', '2010-05-20 01:20:00', '1', '0', '0.009', '0.000', 'PRE' );
Query OK, 1 row affected (0,00 sec)

mysql> select vid_visit,vid_money from videos where video_id=487;                                                                  

+-----------+-----------+
| vid_visit | vid_money |
+-----------+-----------+
|        22 |     0.306 |
+-----------+-----------+

DROP TRIGGER IF EXISTS `updateVisitAndMoney`//
CREATE TRIGGER `updateVisitAndMoney` BEFORE INSERT ON `validEvents`
 FOR EACH ROW BEGIN
    if (NEW.type = 'PRE') THEN
                SET @eventcash=NEW.money_producer + NEW.money_distributor;
        UPDATE campaigns SET cmp_visit_distributed = cmp_visit_distributed + 1 , cmp_money_distributed = cmp_money_distributed + NEW.money_producer + NEW.money_distributor WHERE idcampaigns = NEW.campaigns_id;
        UPDATE offer_producer SET ofp_visit_procesed = ofp_visit_procesed + 1 , ofp_money_procesed = ofp_money_procesed + NEW. money_producer WHERE ofp_video_id = NEW.video_id AND ofp_money_procesed = NEW. campaigns_id;
        UPDATE videos SET vid_visit = vid_visit + 1 , vid_money = vid_money + @eventcash WHERE video_id = NEW.video_id;

        if (NEW.distributor_id != '') then
            UPDATE agreements SET visit_procesed = visit_procesed + 1, money_producer = money_producer + NEW.money_producer, money_distributor = money_distributor + NEW.money_distributor WHERE id_campaigns = NEW. campaigns_id AND id_video = NEW.video_id AND ag_distributor_id = NEW.distributor_id;
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_distributor WHERE date = SYSDATE()  AND campaign_id = NEW. campaigns_id AND user_id = NEW.distributor_id;
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW.money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id= NEW.producer_id;
        ELSE
            UPDATE eventForDay SET visit = visit + 1, money = money + NEW. money_producer WHERE date = SYSDATE() AND campaign_id = NEW. campaigns_id AND user_id = NEW.producer_id;
        END IF;
    END IF;
END
//

3 个回答

0

Shell命令只能在控制台里运行,而不是在实际的服务器上。你可以使用用户定义的函数(UDF)或者轮询的方法来实现你想要的功能。

0

如果将来有人看到这个问题,我猜解决办法是把mysql的自动提交设置为开启。打开连接后,执行以下查询:

SET autocommit = 1

1

我觉得你遇到的更可能是一个没有被捕捉到的错误,而不是触发器没有执行,特别是因为它在控制台上能成功执行。

你需要找出错误发生的地方——是在触发器本身,还是在调用的脚本中。

在你的Python脚本中,打印出Python发送给MySQL执行的SQL语句,以确保它的构造符合你的预期。例如,如果NEW.type不等于'PRE',那么触发器会执行,但不会导致任何更新。

同时,确保你在插入时检查错误。我不是Python程序员,所以不能告诉你怎么做,但这个链接似乎是你需要的。

如果这两种方法都没有找到问题,可以把整个if (NEW.type = 'PRE') THEN块注释掉,然后做一个简单的修改,比如把NEW.type设置为'debug'。在确保触发器确实执行后,逐步添加更多真实代码进行测试,直到找到问题所在。

另外,关于Marcos的评论,如果脚本在成功完成后没有自动提交,我会感到惊讶。实际上,我对任何脚本或语言都可以这样说。

撰写回答