📜  SQL 触发器 |学生数据库(1)

📅  最后修改于: 2023-12-03 15:35:06.589000             🧑  作者: Mango

SQL 触发器 | 学生数据库

在处理数据库时,SQL 触发器是非常有用的工具之一。SQL 触发器是用来响应某些事件或者操作的一类数据库对象,比如插入、更新或者删除数据。触发器通常与存储过程、函数、视图等数据库对象一起使用。

下面是一个使用 SQL 触发器的学生数据库的例子:

数据库设计

我们有一个简单的学生数据库。这个数据库包括以下表:

student 表
+--------+--------------+------+-----+---------+----------------+
| Field  | Type         | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id     | int(11)      | NO   | PRI | NULL    | auto_increment |
| name   | varchar(255) | YES  |     | NULL    |                |
| gender | varchar(10)  | YES  |     | NULL    |                |
| age    | int(11)      | YES  |     | NULL    |                |
+--------+--------------+------+-----+---------+----------------+
course 表
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(255) | YES  |     | NULL    |                |
| teacher | varchar(255) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
score 表
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| studentId | int(11) | YES  |     | NULL    |                |
| courseId  | int(11) | YES  |     | NULL    |                |
| score     | int(11) | YES  |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+
触发器设计

在这个学生数据库中,我们想要在插入或者更新 score 表时自动更新 student 表中的成绩信息。具体来说,我们需要将每个学生的成绩平均值存储在 student 表中。为了实现这一功能,我们可以使用以下 SQL 触发器:

DROP TRIGGER IF EXISTS update_student_score;
CREATE TRIGGER update_student_score AFTER INSERT ON score
FOR EACH ROW
BEGIN
    -- 更新学生的成绩平均值
    UPDATE student
    SET avg_score = (SELECT AVG(score) FROM score WHERE studentId = NEW.studentId)
    WHERE id = NEW.studentId;
END;


DROP TRIGGER IF EXISTS update_student_score;
CREATE TRIGGER update_student_score AFTER UPDATE ON score
FOR EACH ROW
BEGIN
    -- 更新学生的成绩平均值
    UPDATE student
    SET avg_score = (SELECT AVG(score) FROM score WHERE studentId = NEW.studentId)
    WHERE id = NEW.studentId;
END;

这个 SQL 触发器在每次插入或更新 score 表时自动更新 student 表中的成绩信息。其中,AFTER INSERT 和 AFTER UPDATE 分别表示在执行插入和更新操作后触发触发器。

使用触发器

有了触发器之后,我们可以很方便地实现自动更新 student 表中的成绩信息。下面是一个示例:

-- 插入一条成绩记录
INSERT INTO score (studentId, courseId, score) VALUES (1, 1, 80);

-- 查看 student 表中的信息
SELECT * FROM student WHERE id = 1;

这个 SQL 语句会将一条成绩记录插入 score 表中,并自动更新 student 表中的成绩信息。同时,我们可以通过 SELECT 语句查看 student 表中的信息,结果如下:

+----+------+--------+-----+
| id | name | gender | age |
+----+------+--------+-----+
|  1 | Tom  | male   |  18 |
+----+------+--------+-----+

可以看到,这个 SQL 触发器成功地自动更新了 student 表中的成绩信息。