gpt4 book ai didi

MySQL触发器检查插入是否成功

转载 作者:行者123 更新时间:2023-11-29 09:55:48 25 4
gpt4 key购买 nike

正如标题中提到的,我创建了一个触发器,当新值插入“候选”表时捕获,并将一些信息存储在“历史”表中。但是,我还想存储插入是否成功,但似乎无法使其正常工作。我尝试过:

DELIMITER $$
CREATE TRIGGER cand_i BEFORE INSERT ON candidate FOR EACH ROW
BEGIN
DECLARE action varchar(10);
IF(EXISTS(select username from candidate where username=NEW.username)) THEN
SET action='Failed';
ELSE SET action='Success';
END IF;
INSERT INTO history (actiontype,actiondate,actionsuccess,actiontable,username)
VALUES ('Insert',now(),action,'Candidate',NEW.username);
END $$
DELIMITER ;

有什么建议吗?

最佳答案

如果您正在使用非事务表(例如 MyISAM)history表中,您可以通过使用BEFORE来达到您想要的结果和AFTER触发器如原始答案中所述。如果两者candidatehistory是事务表(例如 InnoDB),如果 INSERT失败,整个事务 - 包括 BEFORE 中执行的操作触发器 - 被回滚,因此此方法将不起作用。在这种情况下,您需要使用 AFTER触发如下所述,并执行INSERThistory INSERT之前的表到候选表,例如

INSERT INTO history (actiontype,actiondate,actionsuccess,actiontable,username)
VALUES ('Insert',now(),'Failed','Candidate','<username>');
INSERT INTO candidate (..., username, ...)
VALUES (..., '<username>', ...);

原始答案

既然你想记录INSERT ,无论成功与否,您都需要使用两个触发器来实现。在 BEFORE触发器,只需创建一个状态为失败的条目,并在 AFTER 中触发,将状态更新为Success 。自 AFTER仅当行操作成功( manual )时才会运行触发器,这将执行您想要的操作。

DELIMITER $$
CREATE TRIGGER cand_i BEFORE INSERT ON candidate FOR EACH ROW
BEGIN
INSERT INTO history (actiontype,actiondate,actionsuccess,actiontable,username)
VALUES ('Insert',now(),'Failed','Candidate',NEW.username);
END $$

CREATE TRIGGER cand_i_a AFTER INSERT ON candidate FOR EACH ROW
BEGIN
UPDATE history
SET actionsuccess = 'Success'
WHERE actiontype = 'Insert' AND actiontable = 'Candidate' AND username = NEW.username;
END $$
DELIMITER ;

关于MySQL触发器检查插入是否成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53890298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com