代码之家  ›  专栏  ›  技术社区  ›  genespos

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

  •  4
  • genespos  · 技术社区  · 10 年前

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

    新行数据字段将为:

    标识用户 ->从插入表“userlite”的新行

    IdLite公司 ->在插入到表“userlite”中的新行和从表“litedetails”中选择的行中也是一样的

    标识事件 ->从选定的行

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

    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) 如果触发器失败,谁启动触发器的查询将保持其效果?

    1 回复  |  直到 10 年前
        1
  •  4
  •   N.B.    10 年前

    按照注释:当使用支持事务的表时,触发器是语句的一部分。如果触发器失败,它将导致触发它的查询也失败,这将导致回滚。这适用于 InnoDB 和 TokuDB 存储引擎。

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

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