什么可以使触发器失败以及如果失败会发生什么
What can make a trigger to fail and what happens if it fails
我创建了一个触发器(以前从未创建过)。
我的目标是:
当将一行或多行插入 table 'userlite'
如果在 table 'litedetails'
中插入的新行中有 'IdLite' 行
然后为每个计数的行添加一行到 table 'informations'。
新行数据字段将是:
IdUser -> 从新行插入 table 'userlite'
IdLite -> 插入 table 'userlite' 的新行和从 table [= 中选择的行相同40=]
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) 如果触发器失败,启动触发器的查询将保持其效果?
根据评论:当使用支持事务的表时,触发器就是语句的一部分。如果触发器失败,它会导致触发它的查询也失败,从而导致回滚。这适用于 InnoDB
和 TokuDB
存储引擎。
对于非事务引擎的 MyISAM,触发器可能会出错,但不会导致回滚(因为该存储引擎不支持它)。
触发器可能由于多种原因而失败,就像常规查询一样,但如果它们失败 - 您将收到一条错误消息/通知,让您采取行动(通知用户失败,记录消息,再试一次等等)。
我创建了一个触发器(以前从未创建过)。
我的目标是:
当将一行或多行插入 table 'userlite'
如果在 table 'litedetails'
中插入的新行中有 'IdLite' 行
然后为每个计数的行添加一行到 table 'informations'。
新行数据字段将是:
IdUser -> 从新行插入 table 'userlite'
IdLite -> 插入 table 'userlite' 的新行和从 table [= 中选择的行相同40=]
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) 如果触发器失败,启动触发器的查询将保持其效果?
根据评论:当使用支持事务的表时,触发器就是语句的一部分。如果触发器失败,它会导致触发它的查询也失败,从而导致回滚。这适用于 InnoDB
和 TokuDB
存储引擎。
对于非事务引擎的 MyISAM,触发器可能会出错,但不会导致回滚(因为该存储引擎不支持它)。
触发器可能由于多种原因而失败,就像常规查询一样,但如果它们失败 - 您将收到一条错误消息/通知,让您采取行动(通知用户失败,记录消息,再试一次等等)。