触发器:触发器是数据库中的一个存储过程,它在数据库中发生特殊事件时自动调用。例如,可以在将行插入到指定表中或更新某些表列时调用触发器。
句法:
create trigger [trigger_name]
[before | after]
{insert | update | delete}
on [table_name]
[for each row]
[trigger_body]
语法说明:
- create trigger [trigger_name]:使用 trigger_name 创建或替换现有触发器。
- [之前| after]:指定触发器何时执行。
- {插入 |更新 | delete}:这指定了 DML 操作。
- on [table_name]:指定与触发器关联的表的名称。
- [for each row]:指定一个行级触发器,即对受影响的每一行执行触发器。
- [trigger_body]:这提供了触发触发器时要执行的操作
触发器之前和之后:
BEFORE 触发器在运行触发语句之前运行触发器操作。
AFTER 触发器在触发语句运行后运行触发器操作。
例子:
给定学生报告数据库,其中记录了学生成绩评估。在这种模式中,创建一个触发器,以便在插入记录时自动插入指定标记的总数和平均值。
在这里,由于触发器将在插入记录之前调用,因此可以使用 BEFORE 标记。
假设数据库架构 –
mysql> desc Student;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| tid | int(4) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | YES | | NULL | |
| subj1 | int(2) | YES | | NULL | |
| subj2 | int(2) | YES | | NULL | |
| subj3 | int(2) | YES | | NULL | |
| total | int(3) | YES | | NULL | |
| per | int(3) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)
问题语句的 SQL 触发器。
create trigger stud_marks
before INSERT
on
Student
for each row
set Student.total = Student.subj1 + Student.subj2 + Student.subj3, Student.per = Student.total * 60 / 100;
上面的 SQL 语句将在学生数据库中创建一个触发器,每当输入科目分数时,在将此数据插入数据库之前,触发器将计算这两个值并插入输入的值。 IE,
mysql> insert into Student values(0, "ABCDE", 20, 20, 20, 0, 0);
Query OK, 1 row affected (0.09 sec)
mysql> select * from Student;
+-----+-------+-------+-------+-------+-------+------+
| tid | name | subj1 | subj2 | subj3 | total | per |
+-----+-------+-------+-------+-------+-------+------+
| 100 | ABCDE | 20 | 20 | 20 | 60 | 36 |
+-----+-------+-------+-------+-------+-------+------+
1 row in set (0.00 sec)
通过这种方式触发器可以在数据库中创建和执行。