mysql创建触发器,实现当向SC表插入一行数据时,根据成绩对student表的总学分进行修改。如果成绩>=60,总学分加上该课程的学分,否则总学分不变。
时间: 2024-03-20 19:41:48 浏览: 110
好的,这是一个关于MySQL触发器的问题。这里是一个实现该功能的MySQL触发器的示例代码:
```
CREATE TRIGGER update_credit AFTER INSERT ON SC
FOR EACH ROW
BEGIN
IF NEW.grade >= 60 THEN
UPDATE student
SET total_credit = total_credit + (SELECT credit FROM course WHERE course_id = NEW.course_id)
WHERE student_id = NEW.student_id;
END IF;
END;
```
这个触发器会在SC表中插入一行数据时自动触发。如果这行数据的成绩(grade)大于等于60,那么它会查找对应课程的学分(credit),并将该学分加到student表中对应学生的总学分(total_credit)上。如果成绩小于60,总学分不会发生变化。
相关问题
基于school数据库中的student, course, sc表,在SQL数据库中创建满足下述要求的触发器:对SC表进行插入时,如果学生的选课总学分超过30,则报错并撤销插入。
好的,这是一个有趣的问题。以下是可以在MySQL数据库中创建的触发器代码:
```
CREATE TRIGGER check_sc BEFORE INSERT ON sc
FOR EACH ROW
BEGIN
DECLARE total_credits INT;
SELECT SUM(credit) INTO total_credits FROM course WHERE cno = NEW.cno;
SELECT SUM(credit) INTO total_credits FROM sc WHERE sno = NEW.sno;
IF (total_credits > 30) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '选课总学分超过30';
END IF;
END;
```
该触发器会在每次向SC表中插入新记录之前被触发。它会计算该学生所选课程的总学分,并检查该总学分是否超过了30。如果超过了30,则会报错并撤销插入。这可以通过使用SIGNAL语句来实现,该语句会抛出一个异常,并显示指定的错误消息。
假设有学生-选课数据库,其中有学生表,课程表,教师表,选课表,其结构如下:学生(学号,姓名,专业,入学年份),课程(课程号,课程名,学分),选课(学号,课程号,成绩)。一门课程可以被多名学生选修,一名学生可以选修多门课程。 (1)为了提高各课程的及格率,在统计其成绩之前,将学生成绩分布于55-60之间的均修改为60,再录入学生档案中。(使用触发器完成) (2)对每个学生,统计其获得的最高成绩的课程号。(使用视图完成) (3)任意给定一门课程号,统计其成绩分布,如:最高分,最低分,平均分,各分数段人数;(使用存储过程完成)请携出其相关的开发平台的选取与原因分析;系统的需求分析,概念结构设计,逻辑结构设计
很好,我会尽力回答你的问题。
1. 触发器实现学生成绩修改
触发器可以在特定的数据库操作时自动执行,因此可以使用触发器实现学生成绩修改。具体实现步骤如下:
首先,创建一个名为“update_grade”的触发器,当学生成绩表(grade)中的成绩分布于55-60之间时,触发器自动将成绩修改为60,并将修改后的成绩录入学生档案表(student)中。
触发器代码如下:
CREATE TRIGGER update_grade ON grade
AFTER INSERT, UPDATE
AS
BEGIN
UPDATE grade SET score = 60
WHERE score BETWEEN 55 AND 60
INSERT INTO student (student_no, name, course_no, score)
SELECT i.student_no, s.name, i.course_no, 60
FROM inserted i INNER JOIN student s ON i.student_no = s.student_no
WHERE i.score BETWEEN 55 AND 60
END
2. 视图统计学生获得的最高成绩的课程号
视图可以根据多个表的数据生成一个虚拟表,因此可以使用视图实现统计学生获得的最高成绩的课程号。具体实现步骤如下:
首先,创建一个名为“max_score”的视图,该视图根据学生表(student)和选课表(select_course)中的数据生成一个虚拟表,其中每个学生对应最高成绩所对应的课程号。
视图代码如下:
CREATE VIEW max_score AS
SELECT s.student_no, MAX(score) AS max_score, course_no
FROM student s INNER JOIN select_course sc ON s.student_no = sc.student_no
GROUP BY s.student_no, course_no
3. 存储过程统计课程成绩分布
存储过程可以根据输入参数执行一系列操作并返回结果,因此可以使用存储过程实现统计课程成绩分布。具体实现步骤如下:
首先,创建一个名为“course_score_distribution”的存储过程,该存储过程接受一个课程号作为输入参数,然后根据学生成绩表(grade)中该课程的成绩数据统计课程的成绩分布,最后将成绩分布结果作为输出参数返回。
存储过程代码如下:
CREATE PROCEDURE course_score_distribution @course_no VARCHAR(20), @max_score INT OUTPUT, @min_score INT OUTPUT, @avg_score FLOAT OUTPUT, @score_0_59 INT OUTPUT, @score_60_69 INT OUTPUT, @score_70_79 INT OUTPUT, @score_80_89 INT OUTPUT, @score_90_100 INT OUTPUT
AS
BEGIN
SELECT @max_score = MAX(score), @min_score = MIN(score), @avg_score = AVG(score),
@score_0_59 = COUNT(CASE WHEN score BETWEEN 0 AND 59 THEN 1 END),
@score_60_69 = COUNT(CASE WHEN score BETWEEN 60 AND 69 THEN 1 END),
@score_70_79 = COUNT(CASE WHEN score BETWEEN 70 AND 79 THEN 1 END),
@score_80_89 = COUNT(CASE WHEN score BETWEEN 80 AND 89 THEN 1 END),
@score_90_100 = COUNT(CASE WHEN score BETWEEN 90 AND 100 THEN 1 END)
FROM grade
WHERE course_no = @course_no
END
开发平台的选取与原因分析:
对于这个问题,我们可以使用多种不同的开发平台来实现。下面介绍两种常用的开发平台及其选取原因。
1. SQL Server + T-SQL
SQL Server 是一种常用的关系型数据库管理系统,它提供了丰富的 T-SQL 语言支持,可以方便地实现触发器、视图、存储过程等数据库相关功能。此外,SQL Server 还具有良好的可扩展性和安全性,可以满足大部分企业级应用的需求。
2. MySQL + PHP
MySQL 是一种开源的关系型数据库管理系统,它提供了丰富的 SQL 语言支持,可以方便地实现触发器、视图、存储过程等数据库相关功能。PHP 是一种常用的服务器端脚本语言,它可以与 MySQL 数据库进行良好的集成,可以方便地实现与用户的交互和数据处理。
因此,我们可以根据实际需求选取适合的开发平台来实现该问题。如果需要实现大规模的企业级应用,可以选择 SQL Server + T-SQL;如果需要实现简单的网站应用,可以选择 MySQL + PHP。
阅读全文