视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
数据库基础<四>触发器
2020-11-09 15:32:09 责编:小采
文档


1、概念 触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,一旦定义,任何用户 对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。 2、定义触发器 create trigger 触发器名 before|after 触发事件

1、概念

触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,一旦定义,任何用户

对表的增、删、改操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。


2、定义触发器

create trigger <触发器名> before|after <触发事件> on <表名>

for each row|statement [when <触发条件>] <触发动作体>

触发事件:可以是 insert、delete 或 update ,可以是几个事件的组合,用or连接

update 后面还可以有 of<触发列,...>

触发器类型:分为 for each row(行级触发器)和 for each statement(语句级触发器,触发一次)

触发动作体:可以是一个过程块或是对已创建存储过程的调用,如果是行级触发器,可以在过程体中

使用 new 和 old 引用 update/insert 事件之后的新值和 update/delete 事件之前的旧值


3、激活触发器

同一个表上的多个触发器激活时的执行顺序:

1)执行该表上的 before 触发器

2)激活触发器的 SQL 语句

3)执行该表上的 after 触发器

查看触发器是否被激活:show triggers

4、删除触发器

drop trigger <触发器名> on <表名>


5、mysql 触发器实例

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 | /* 改变输入结束符 */

 

CREATE TRIGGER testref BEFORE INSERT ON test1

 FOR EACH ROW BEGIN

 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);


如果将下述值插入表test1,如下所示:

mysql> INSERT INTO test1 VALUES 

 -> (1), (3), (1), (7), (1), (8), (4), (4);


Query OK, 8 rows affected (0.01 sec)

Records: 8 Duplicates: 0 Warnings: 0


那么4个表中的数据如下:


mysql> SELECT * FROM test1;

+------+

| a1 |

+------+

| 1 |

| 3 |

| 1 |

| 7 |

| 1 |

| 8 |

| 4 |

| 4 |

+------+

8 rows in set (0.00 sec)

 

mysql> SELECT * FROM test2;

+------+

| a2 |

+------+

| 1 |

| 3 |

| 1 |

| 7 |

| 1 |

| 8 |

| 4 |

| 4 |

+------+

8 rows in set (0.00 sec)

 

mysql> SELECT * FROM test3;

+----+

| a3 |

+----+

| 2 |

| 5 |

| 6 |

| 9 |

| 10 |

+----+

5 rows in set (0.00 sec)

 

mysql> SELECT * FROM test4;

+----+------+

| a4 | b4 |

+----+------+

| 1 | 3 |

| 2 | 0 |

| 3 | 1 |

| 4 | 2 |

| 5 | 0 |

| 6 | 0 |

| 7 | 1 |

| 8 | 1 |

| 9 | 0 |

| 10 | 0 |

+----+------+

10 rows in set (0.00 sec)

下载本文
显示全文
专题