1、创建触发器,初始化数据:
CREATE TABLE test1(a1 INT);
CREATE TABLE test2(a2 INT);
CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE test4(
a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
b4 INT DEFAULT 0
);
DELIMITER | # 定界符
# 定义testref触发器,在插入test1之前触发
# 触发动作:INSERT、DELETE或UPDATE
# 触发时间:BEFORE或AFTER
CREATE TRIGGER testref BEFORE INSERT ON test1
FOR EACH ROW BEGIN
# 别名OLD和NEW,能够引用与触发程序相关的表中的列。
# OLD.col_name在更新或删除它之前,引用已有行中的1列。
# NEW.col_name在更新它之后引用将要插入的新行的1列或已有行的1列。
INSERT INTO test2 SET a2 = NEW.a1;
DELETE FROM test3 WHERE a3 = NEW.a1;
UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;
END
|
DELIMITER ;
INSERT INTO test3 (a3) VALUES
(NULL), (NULL), (NULL), (NULL), (NULL),
(NULL), (NULL), (NULL), (NULL), (NULL);
INSERT INTO test4 (a4) VALUES
(0), (0), (0), (0), (0), (0), (0), (0), (0), (0);
2、对test1插入一条数据:
INSERT INTO test1 VALUES (1), (3), (1), (7), (1), (8), (4), (4);
对比结果如图所示:
test1数据表前后对比图:
test2数据表前后对比图:
test3数据表前后对比图:
test4数据表前后对比图:
3、删除触发器:DROP TRIGGER testref;
4、补充说明:
在触发程序的执行过程中,MySQL处理错误的方式如下:
- 如果BEFORE触发程序失败,不执行相应行上的操作。
- 仅当BEFORE触发程序(如果有的话)和行操作均已成功执行,才执行AFTER触发程序。
- 如果在BEFORE或AFTER触发程序的执行过程中出现错误,将导致调用触发程序的整个语句的失败。
- 对于事务性表,如果触发程序失败(以及由此导致的整个语句的失败),该语句所执行的所有更改将回滚。对于非事务性表,不能执行这类回滚,因而,即使语句失败,失败之前所作的任何更改依然有效。