建立一个后触发器, 当向成绩表中插入或修改记录时, 如果插入或修改的数据与学生表学号和课程表课程号的中数据不匹配 此插入或修改无效
时间: 2024-01-22 13:17:40 浏览: 157
可以使用触发器实现,以下是一个基本的示例:
```sql
CREATE TRIGGER check_grades_match
AFTER INSERT OR UPDATE ON grades
FOR EACH ROW
BEGIN
DECLARE s_id INT;
DECLARE c_id INT;
SELECT student_id, course_id INTO s_id, c_id FROM students_courses
WHERE student_id = NEW.student_id AND course_id = NEW.course_id;
IF s_id IS NULL OR c_id IS NULL THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid insert/update: student or course not found in students_courses table';
END IF;
END;
```
这个触发器会在每次插入或更新 `grades` 表中的记录时执行。首先,它会查询 `students_courses` 表,查找与新插入或更新的记录中的 `student_id` 和 `course_id` 匹配的记录。如果找不到匹配的记录,则触发器会抛出一个错误,使插入或更新操作无效。
相关问题
建立一个后触发器,当向成绩表中插入或修改记录时,如果插入或修改的数据与学生表学号和课程表课程号的中数据不匹配,此插入或修改无效.
这个后触发器可以在数据库中使用以下的 SQL 语句来创建:
```
CREATE TRIGGER check_grade
AFTER INSERT OR UPDATE ON grade
FOR EACH ROW
BEGIN
DECLARE student_id INT;
DECLARE course_id INT;
SELECT COUNT(*) INTO student_id FROM student WHERE student_id = NEW.student_id;
SELECT COUNT(*) INTO course_id FROM course WHERE course_id = NEW.course_id;
IF student_id = 0 OR course_id = 0 THEN
DELETE FROM grade WHERE grade_id = NEW.grade_id;
END IF;
END;
```
在这个触发器中,我们使用了 `AFTER INSERT OR UPDATE` 语句来指定在插入或更新成绩表之后触发该触发器。`FOR EACH ROW` 语句表示这是一行触发器,会在每一行数据被插入或更新时都执行一次。
在触发器的主体中,我们首先声明了两个变量 `student_id` 和 `course_id`,用于存储查询结果的计数器。然后,我们使用两个 `SELECT COUNT(*)` 语句来查询学生表和课程表中是否存在与插入或更新记录中的学号和课程号匹配的数据。
如果其中一个计数器为 0,表示学生表或课程表中不存在对应的学号或课程号,那么我们就会使用 `DELETE FROM grade WHERE grade_id = NEW.grade_id` 语句来删除这条成绩数据。这样,就能保证成绩表中只有与学生表和课程表中匹配的数据。
编写存储过程,对学生成绩表进行插入操作,并通过触发器保证插入时,学号与学生情况表中的学号字段一致,课程号与课程表中对应字段一致。其中触发器分别用后触发器和替代触发器实现。
好的,这是一个关于数据库的问题,以下是代码示例:
存储过程:
CREATE PROCEDURE insert_score
(
@studentId INT,
@courseId INT,
@score DECIMAL(4,2)
)
AS
BEGIN
INSERT INTO score (student_id,course_id,score)
VALUES (@studentId,@courseId,@score)
END
后触发器:
CREATE TRIGGER student_id_match ON score AFTER INSERT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM student_info WHERE student_info.student_id IN (SELECT student_id FROM inserted))
BEGIN
RAISERROR('The inserted student ID does not exist in the student_info table!',16,1)
ROLLBACK TRAN
RETURN
END
END
CREATE TRIGGER course_id_match ON score AFTER INSERT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM course_info WHERE course_info.course_id IN (SELECT course_id FROM inserted))
BEGIN
RAISERROR('The inserted course ID does not exist in the course_info table!',16,1)
ROLLBACK TRAN
RETURN
END
END
替代触发器:
CREATE TRIGGER student_id_match ON score INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM student_info WHERE student_info.student_id IN (SELECT student_id FROM inserted))
BEGIN
RAISERROR('The inserted student ID does not exist in the student_info table!',16,1)
ROLLBACK TRAN
RETURN
END
ELSE
BEGIN
INSERT INTO score (student_id,course_id,score)
SELECT student_id,course_id,score FROM inserted
END
END
CREATE TRIGGER course_id_match ON score INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (SELECT * FROM course_info WHERE course_info.course_id IN (SELECT course_id FROM inserted))
BEGIN
RAISERROR('The inserted course ID does not exist in the course_info table!',16,1)
ROLLBACK TRAN
RETURN
END
ELSE
BEGIN
INSERT INTO score (student_id,course_id,score)
SELECT student_id,course_id,score FROM inserted
END
END
希望以上代码能够帮到您!
阅读全文