我有下面的扳机,真是烦死我了。
我想在触发器中进行更新,但是MySQL不允许它,因为“触发”触发器的语句是指参与者表。
我能做些什么才能让它发挥作用?我考虑过存储过程,但在这种情况下也是禁止的。
逻辑是:我有一张有与会者参加会议的桌子。如果来自'vip‘组的人出席,那么来自'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。
发布于 2015-09-25 07:31:13
看来你不可能在扳机里做到这一切。触发器已经锁定了表,因此update语句无法获得锁。根据mysql
在存储的函数或触发器中,不允许修改调用函数或触发器的语句已经使用(用于读取或写入)的表。
因此,您可以创建一个存储过程,该存储过程插入/更新目标表,然后更新另一行(全部在事务中)。使用存储的proc,您将手动提交更改(插入和更新)。
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;https://stackoverflow.com/questions/32765515
复制相似问题