sql使用触发器实现删除学生时级联删除该生选课记录
时间: 2024-11-03 17:19:18 浏览: 68
SQL中的触发器是一种特殊的存储过程,它会在特定数据库操作(如INSERT、UPDATE或DELETE)执行前后自动执行预设的操作。如果你想实现当删除一个学生时,同时也自动删除该学生的所有选课记录,你可以创建一个删除(DELETION)触发器。
以下是基本的SQL创建触发器的语法:
```sql
CREATE TRIGGER delete_student_with_courses
AFTER DELETE ON students
FOR EACH ROW
BEGIN
DELETE FROM courses WHERE student_id = OLD.student_id;
END;
```
在这个例子中:
- `CREATE TRIGGER` 创建一个新的触发器。
- `delete_student_with_courses` 是触发器的名称,可以根据需要自定义。
- `AFTER DELETE ON students` 指定触发器在删除students表中的行之后执行。
- `FOR EACH ROW` 表示每次删除一行都会执行触发器内的SQL。
- `OLD.student_id` 表示在被删除的学生记录中引用的字段,用于关联学生和课程表之间的关系。
当你执行删除学生的命令时,这个触发器会自动运行并删除相关的选课记录。
相关问题
在学生表上创建更新触发器,使学生表修改一个学生的学号后,级联更新选课表对应的选课记录的SQL代码
好的,以下是可以实现你要求的 SQL 代码:
```sql
CREATE TRIGGER update_student_id
AFTER UPDATE ON student
FOR EACH ROW
BEGIN
UPDATE course_selection
SET student_id = NEW.student_id
WHERE old.student_id = course_selection.student_id;
END;
```
这个触发器会在学生表上有一个学号被修改后被触发,然后会自动将选课表中与该学生相关的选课记录的学生 ID 修改为新的学生 ID。其中,`NEW.student_id` 表示修改后的学生 ID,`old.student_id` 表示修改前的学生 ID。
SQL语句写在学生表和选课表间建立为维护参照完整性使用的级联删除触发器、级联修改触发器和受限插入触发器
创建学生表:
```
CREATE TABLE student (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
gender VARCHAR(10) NOT NULL
);
```
创建选课表:
```
CREATE TABLE course (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
teacher VARCHAR(50) NOT NULL,
credit FLOAT NOT NULL
);
```
创建选课记录表:
```
CREATE TABLE student_course (
id INT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
score FLOAT,
FOREIGN KEY (student_id) REFERENCES student(id) ON DELETE CASCADE ON UPDATE CASCADE,
FOREIGN KEY (course_id) REFERENCES course(id) ON DELETE CASCADE ON UPDATE CASCADE
);
```
级联删除触发器:
```
CREATE TRIGGER delete_student_course
AFTER DELETE ON student
FOR EACH ROW
BEGIN
DELETE FROM student_course WHERE student_course.student_id = OLD.id;
END;
```
级联修改触发器:
```
CREATE TRIGGER update_student_course
AFTER UPDATE ON student
FOR EACH ROW
BEGIN
UPDATE student_course SET student_id = NEW.id WHERE student_course.student_id = OLD.id;
END;
```
受限插入触发器:
```
CREATE TRIGGER insert_student_course
BEFORE INSERT ON student_course
FOR EACH ROW
BEGIN
DECLARE student_count INT;
DECLARE course_count INT;
SELECT COUNT(*) INTO student_count FROM student WHERE student.id = NEW.student_id;
SELECT COUNT(*) INTO course_count FROM course WHERE course.id = NEW.course_id;
IF student_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid student id';
END IF;
IF course_count = 0 THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid course id';
END IF;
END;
```
阅读全文