如标题中所述,我创建了一个触发器,该触发器可以在“候选”表中插入新值时捕获该触发器,并将一些信息存储在“历史”表中。但是,我也想存储插入是否成功,但是似乎无法使其正常工作。我尝试过:
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 ;
有什么建议吗?
答案 0 :(得分:1)
如果您为history
表使用了非事务处理表(例如MyISAM),则可以使用BEFORE
和{{1 }}会按照原始答案中的说明进行触发。如果AFTER
和candidate
都是事务表(例如InnoDB),则如果history
失败,则整个事务-包括在{{1 }}触发器-会回滚,因此此方法将不起作用。在这种情况下,您需要使用以下所述的INSERT
触发器,并在BEFORE
至候选表之前执行AFTER
至INSERT
表,例如
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