mysql触发器检查insert是否成功

lg40wkob  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(355)

正如标题中所提到的,我创建了一个触发器,当一个新值插入到“candidate”表中时,它会捕获,并在“history”表中存储一些信息。不过,我也想存储插入是否成功,但似乎不能让它工作。我试过:

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 ;

有什么建议吗?

mzmfm0qo

mzmfm0qo1#

如果您使用的是非事务表(例如myisam)作为 history 表中,您可以使用 BEFORE 以及 AFTER 原始答案中描述的触发器。如果两者都有 candidate 以及 history 如果 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 触发器,只需创建一个状态为failed的条目,并在 AFTER 触发器,将状态更新为 Success . 自 AFTER 触发器仅在行操作成功时运行(手动),这将执行您想要的操作。

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 ;

相关问题