mysql - 如何从 MySQL 中的 INSERT 触发器中更新?我还能采取什么其他方法?

标签 mysql

我有以下触发器,这真的很烦我。

我想在触发器内部执行更新,但 MySQL 不允许这样做,因为“触发”触发器的语句引用了参与者表。

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

逻辑是:我有一张 table ,上面有 session 的参与者。如果来自“vip”组的人参加,来自“tap”组的人应该始终接受邀请的不变性。在这种情况下,如果“贵宾”参加 session ,我必须更新所有“tap”出席,但这怎么可能???

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

最佳答案

看来你不能在触发器中完成所有这些。触发器已锁定表,因此更新语句无法获取锁。根据mysql :

Within a stored function or trigger, it is not permitted to modify a table that is already being used (for reading or writing) by the statement that invoked the function or trigger

所以你可以创建一个存储过程,插入/更新目标表,然后更新其他行,所有这些都在一个事务中。使用存储过程,您将手动提交更改(插入和更新)。

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;

关于mysql - 如何从 MySQL 中的 INSERT 触发器中更新?我还能采取什么其他方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765515/

相关文章:

mysql - 为什么在选择 != 到字符串时 mySQL 不会返回具有空值的行

mysql - 使用一个大 View 比使用两个较小 View 更好(在内存和处理方面)

mysql - 如何从 mysql 数据库创建 json 文件?

mysql - 如何解决activeMQ msyql cluster get Attempting to acquire the Exclusive Lock错误?

mysql - 如何防止创建两个字段值相同的记录?

java - 提交事务后数据未更新

带有子选择的 MySQL 更新太慢

Python mysql-connector 将数字 TEXT 值转换为整数

php - 如何正确导出到包含带逗号的表记录值的 CSV 文件?

mysql - 我该如何处理 Coupon 数据库设计?