MySQL触发检查插入是否成功

时间:2018-12-21 20:08:00

标签: mysql

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

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 ;

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

如果您为history表使用了非事务处理表(例如MyISAM),则可以使用BEFORE和{{1 }}会按照原始答案中的说明进行触发。如果AFTERcandidate都是事务表(例如InnoDB),则如果history失败,则整个事务-包括在{{1 }}触发器-会回滚,因此此方法将不起作用。在这种情况下,您需要使用以下所述的INSERT触发器,并在BEFORE至候选表之前执行AFTERINSERT表,例如

history

原始答案

由于要记录INSERT,无论它是否成功,您都需要使用两个触发器来实现。在INSERT INTO history (actiontype,actiondate,actionsuccess,actiontable,username) VALUES ('Insert',now(),'Failed','Candidate','<username>'); INSERT INTO candidate (..., username, ...) VALUES (..., '<username>', ...); 触发器中,只需创建一个状态为失败的条目,然后在INSERT触发器中将状态更新为BEFORE。由于AFTER触发器仅在行操作成功(manual)时运行,因此将执行您想要的操作。

Success
相关问题