📜  SQL 触发器 |学生数据库

📅  最后修改于: 2021-09-09 12:03:14             🧑  作者: Mango

触发器:触发器是数据库中的一个存储过程,它在数据库中发生特殊事件时自动调用。例如,可以在将行插入到指定表中或更新某些表列时调用触发器。

句法:

create trigger [trigger_name] 
[before | after]  
{insert | update | delete}  
on [table_name]  
[for each row]  
[trigger_body] 

语法说明:

  1. create trigger [trigger_name]:使用 trigger_name 创建或替换现有触发器。
  2. [之前| after]:指定触发器何时执行。
  3. {插入 |更新 | delete}:这指定了 DML 操作。
  4. on [table_name]:指定与触发器关联的表的名称。
  5. [for each row]:指定一个行级触发器,即对受影响的每一行执行触发器。
  6. [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)

通过这种方式触发器可以在数据库中创建和执行。