什么会导致触发器失败,如果失败会发生什么

What can make a trigger to fail and what happens if it fails

提问人:genespos 提问时间:4/16/2016 更新时间:4/17/2016 访问量:5637

问:

我创建了一个触发器(以前从未做过)。
我的目标是:
当将一行或多行插入到表“userlite”
中时,如果有带有“IdLite”的行,如在表“litedetails”中插入的新行中插入,则为计数的每一行向表“信息”
添加一行。

新的行数据字段将为:

IdUser -> 从插入到表“userlite”中的新行

IdLite ->在插入表“userlite”的新行和从表“litedetails”中选择的行上是相同的

IdEvent - 从所选行中>

我使用下面的代码来创建触发器

DELIMITER $$
CREATE TRIGGER after_newuserlite
AFTER INSERT ON userlite
FOR EACH ROW
BEGIN
IF (
    (
     SELECT COUNT(*) 
     FROM litedetails
     WHERE IdLite = NEW.IdLite
    ) > 0
   ) THEN
   INSERT INTO informations (IdUser, IdLite, IdEvent)
   SELECT NEW.IdUser AS IdUser, IdLite, IdEvent
   FROM litedetails
   WHERE IdLite = NEW.IdLite;
END IF;
END;
$$

我已经测试过了,一切似乎都有效,但我担心我缺乏经验,所以我的问题是:
1) 有什么会导致我的触发器失败吗?
2) 如果触发失败会怎样?
3)如果触发器失败,查询谁启动了触发器,将保持其效果?

mysql 数据库触发器

评论

0赞 Toby Allen 4/16/2016
您应该调查事务,因为这些事务可确保所有操作都发生或不发生任何操作。
0赞 genespos 4/16/2016
@TobyAllen 感谢您的评论,但正如我所说,我以前从未使用过 trigge,所以我不知道如何正确测试它。
0赞 Toby Allen 4/16/2016
您是否调查过交易?
0赞 genespos 4/16/2016
@TobyAllen 对不起,我的限制,这意味着什么?
2赞 N.B. 4/16/2016
如果使用事务表(存储引擎符合 ACID),则触发器失败会导致整个语句失败,从而导致回滚。如果不使用事务表 (MyISAM),则语句所做的任何更改都将生效,即使触发器失败也是如此。基本上,如果您使用 InnoDB 或 TokuDB 并且您的触发器失败,这也将导致您的查询失败,因此不会进行写入,并且会引发错误并发回。至于是什么导致触发器失败 - 这可能涉及很多事情,但重要的是要知道,如果它失败,您将收到通知:)

答:

4赞 N.B. 4/17/2016 #1

根据注释:当使用支持事务的表时,触发器是语句的一部分。如果触发器失败,则会导致触发它的查询也失败,从而导致回滚。这适用于存储引擎。InnoDBTokuDB

对于不是事务引擎的 MyISAM,触发器可能会出错,但不会导致回滚(因为该存储引擎不支持它)。

触发器可能由于多种原因而失败,就像常规查询一样,但如果它们失败 - 您将收到一条错误消息/通知,让您对其采取行动(通知用户失败、记录消息、重试等)。