首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从MySQL中的插入触发器中进行更新?我还能采取什么其他方法?

问如何从MySQL中的插入触发器中进行更新?我还能采取什么其他方法?
EN

Stack Overflow用户
提问于 2015-09-24 15:39:29
回答 1查看 50关注 0票数 2

我有下面的扳机,真是烦死我了。

我想在触发器中进行更新,但是MySQL不允许它,因为“触发”触发器的语句是指参与者表。

我能做些什么才能让它发挥作用?我考虑过存储过程,但在这种情况下也是禁止的。

逻辑是:我有一张有与会者参加会议的桌子。如果来自'vip‘组的人出席,那么来自'tap’组的人应该始终接受邀请这一不变条件。在这种情况下,如果有“贵宾”出席会议,我必须更新的所有“点击”出席情况,但这怎么可能?

代码语言:javascript
复制
DELIMITER $$

CREATE TRIGGER tap_meet_vip
BEFORE INSERT ON participants
FOR EACH ROW BEGIN
    IF (NEW.pid IN (SELECT userid FROM people WHERE `group` = 'vip')) THEN  # new participant is a member of the vip group
        UPDATE participants SET `status` = 'a' WHERE pid IN (SELECT userid FROM people WHERE `group` = 'tap') AND meetid = NEW.meetid ; # update status to `accept` of all tap group participants   
    ELSEIF (NEW.pid IN (SELECT userid FROM people WHERE `group` = 'tap') AND EXISTS (SELECT * FROM participants INNER JOIN people ON pid = userid WHERE `group` = 'vip')) THEN # new participant is a member of the tap group and meeting has vip participant
        SET NEW.`status` = 'a';
    END IF;
END;$$

上面的代码是用MySQL编写的,版本为5.6。

EN

回答 1

Stack Overflow用户

发布于 2015-09-25 07:31:13

看来你不可能在扳机里做到这一切。触发器已经锁定了表,因此update语句无法获得锁。根据mysql

在存储的函数或触发器中,不允许修改调用函数或触发器的语句已经使用(用于读取或写入)的表。

因此,您可以创建一个存储过程,该存储过程插入/更新目标表,然后更新另一行(全部在事务中)。使用存储的proc,您将手动提交更改(插入和更新)。

代码语言:javascript
复制
DROP PROCEDURE IF EXIST marks;
DELIMITER $$
CREATE PROCEDURE marks(IN marks INT)
BEGIN 
     INSERT INTO first VALUES(marks);
END $$
DELIMITER ;

START TRANSACTION;
INSERT INTO first VALUES (16);
CALL marks(18);
COMMIT;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32765515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档