📅  最后修改于: 2023-12-03 15:35:06.589000             🧑  作者: Mango
在处理数据库时,SQL 触发器是非常有用的工具之一。SQL 触发器是用来响应某些事件或者操作的一类数据库对象,比如插入、更新或者删除数据。触发器通常与存储过程、函数、视图等数据库对象一起使用。
下面是一个使用 SQL 触发器的学生数据库的例子:
我们有一个简单的学生数据库。这个数据库包括以下表:
+--------+--------------+------+-----+---------+----------------+
| 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 | |
+--------+--------------+------+-----+---------+----------------+
+---------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| teacher | varchar(255) | YES | | NULL | |
+---------+--------------+------+-----+---------+----------------+
+-----------+---------+------+-----+---------+----------------+
| 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 表中的成绩信息。