MySQL的触发器和存储过程一样,都是嵌入到MySQL的一段程序。触发器是由时间来触发某个操作,这些时间包括INSERT、UODATE和DELETE语句。如果定义了触发程序,当数据库执行这些语句的时候就会触发执行相应的操作,触发程序是与表有关的命名数据库对象,当表上出现特定事件时,当激活该对象。
11.1、创建触发器
触发器是一个特殊的存储过程,不同的是,执行存储过程要使用CALL语句来调用,而触发器的执行不需要使用CALL语句来调用,也不需要手工启动,只要当预定义的时间发生的时候,就会被MySQL自动调用。
创建一个触发器的语法为:
1
2
|
CREATE
TRIGGER
trigger_name trigger_time trigger_event
ON
tbl_name
FOR
EACH ROW trigger_body
|
trigger_name:触发器名称,用户自行指定 trigger_time:触发时机,可以指定为before或after trigger_event:标识触发事件 tbl_name:标识触发器的表名 trigger_body:触发器执行语句 |
创建一个单执行语句的触发器:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mysql>
CREATE
TABLE
account (acc_num
INT
,amount
DECIMAL
(10,2));
Query OK, 0
rows
affected (0.06 sec)
mysql>
CREATE
TRIGGER
ins_sum BEFORE
INSERT
ON
account
->
FOR
EACH ROW
SET
@
sum
= @
sum
+NEW.amount;
Query OK, 0
rows
affected (0.02 sec)
mysql>
SET
@
sum
=0;
Query OK, 0
rows
affected (0.00 sec)
mysql>
INSERT
INTO
account
VALUES
(1,1.00),(2,2.00);
Query OK, 2
rows
affected (0.02 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>
SELECT
@
sum
;
+
------+
| @
sum
|
+
------+
| 3.00 |
+
------+
1 row
in
set
(0.00 sec)
|
创建多个执行语句的触发器的语法:
1
2
3
4
5
|
CREATE
TRIGGER
trigger_name trigger_time trigger_event
ON
tbl_name
FOR
EACH ROW
BEGIN
trigger_stmt
END
|
11.2、查看触发器
查看触发器是指查看数据库中已存在的触发器的定义、状态和触发信息等可以通过SHOW TRUGGERS和在triggers表中查看触发器信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
mysql>
CREATE
TABLE
myevent
-> (
-> id
int
(11)
DEFAULT
NULL
,
-> evt_name
char
(20)
DEFAULT
NULL
-> );
Query OK, 0
rows
affected (0.03 sec)
mysql>
CREATE
TRIGGER
trig_update
AFTER
UPDATE
ON
account
->
FOR
EACH ROW
INSERT
INTO
myevent
VALUES
(1,
'AFTER UPDATE'
);
Query OK, 0
rows
affected (0.05 sec)
mysql> SHOW TRIGGERS \G
*************************** 1. row ***************************
Trigger
: ins_sum
Event:
INSERT
Table
: account
Statement:
SET
@
sum
= @
sum
+NEW.amount
Timing: BEFORE
Created:
NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database
Collation: utf8_general_ci
*************************** 2. row ***************************
Trigger
: trig_update
Event:
UPDATE
Table
: account
Statement:
INSERT
INTO
myevent
VALUES
(1,
'AFTER UPDATE'
)
Timing:
AFTER
Created:
NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database
Collation: utf8_general_ci
2
rows
in
set
(0.00 sec)
|
在MySQL中所有触发器的定义都存在INFORMATION_SCHEMA数据库的TRIGGERS表中,可以通过SELECT 来查看,其语法格式为:
1
|
SELECT
*
FROM
INFORMATION_SCHEMA.TRIGGERS
WHERE
condition;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
mysql>
SELECT
*
FROM
INFORMATION_SCHEMA.TRIGGERS
WHERE
TRIGGER_NAME=
'trig_update'
\G
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: test
TRIGGER_NAME: trig_update
EVENT_MANIPULATION:
UPDATE
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: test
EVENT_OBJECT_TABLE: account
ACTION_ORDER: 0
ACTION_CONDITION:
NULL
ACTION_STATEMENT:
INSERT
INTO
myevent
VALUES
(1,
'AFTER UPDATE'
)
ACTION_ORIENTATION: ROW
ACTION_TIMING:
AFTER
ACTION_REFERENCE_OLD_TABLE:
NULL
ACTION_REFERENCE_NEW_TABLE:
NULL
ACTION_REFERENCE_OLD_ROW: OLD
ACTION_REFERENCE_NEW_ROW: NEW
CREATED:
NULL
SQL_MODE:
DEFINER: root@localhost
CHARACTER_SET_CLIENT: utf8
COLLATION_CONNECTION: utf8_general_ci
DATABASE_COLLATION: utf8_general_ci
1 row
in
set
(0.00 sec)
|
11.3、触发器的使用
触发程序是与表有关的命名数据库对象,当表上出现特定时间时,将激活该对象。
创建一个在account表插入数据之后,更新myevent数据表的触发器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
mysql>
CREATE
TRIGGER
trig_inster
AFTER
INSERT
ON
account
->
FOR
EACH ROW
INSERT
INTO
myevent
VALUES
(2,
'AFTER INSERT'
);
Query OK, 0
rows
affected (0.02 sec)
mysql>
INSERT
INTO
account
VALUES
(1,1.00),(2,2.00);
Query OK, 2
rows
affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql>
SELECT
*
FROM
myevent;
+
------+--------------+
| id | evt_name |
+
------+--------------+
| 2 |
AFTER
INSERT
|
| 2 |
AFTER
INSERT
|
+
------+--------------+
2
rows
in
set
(0.00 sec)
|
11.4、删除触发器
使用DROP TRIGGER语句可以删除MySQL中已经存在的触发器,其语法格式为:
1
|
DROP
TRIGGER
[schema_name.]trigger_name
|
删除一个触发器
1
2
|
mysql>
DROP
TRIGGER
test.ins_sum;
Query OK, 0
rows
affected (0.02 sec)
|
本文转自 梦想成大牛 51CTO博客,原文链接:http://blog.51cto.com/yinsuifeng/1953884,如需转载请自行联系原作者