SQL SERVER 语句写在学生表和选课表间建立为维护参照完整性使用的受限插入触发器
时间: 2024-01-22 13:21:19 浏览: 74
SQL 添加触发器
以下是一个建立学生表(Student)和选课表(Course)之间关系的示例:
```sql
CREATE TABLE Student (
StudentID int PRIMARY KEY,
StudentName varchar(50),
Department varchar(50)
);
CREATE TABLE Course (
CourseID int PRIMARY KEY,
CourseName varchar(50),
Department varchar(50)
);
CREATE TABLE Enrollment (
EnrollmentID int PRIMARY KEY,
CourseID int FOREIGN KEY REFERENCES Course(CourseID),
StudentID int FOREIGN KEY REFERENCES Student(StudentID)
);
```
在这个示例中,我们创建了三个表:学生表(Student)、选课表(Course)和注册表(Enrollment)。注册表包含了学生和课程之间的关系。在注册表(Enrollment)中,我们使用了两个外键来引用学生表和选课表中的数据。这个表结构可以确保每个注册都与一个有效的学生和一门有效的课程相关联。
接下来,我们可以编写一个受限制的插入触发器,以确保只有当学生和课程在其相应的表中存在时,才能向注册表中插入数据。以下是一个示例触发器:
```sql
CREATE TRIGGER tr_Enrollment_Insert
ON Enrollment
INSTEAD OF INSERT
AS
BEGIN
IF NOT EXISTS (SELECT 1 FROM Student s INNER JOIN inserted i ON s.StudentID = i.StudentID)
RAISERROR('Invalid StudentID', 16, 1)
ELSE IF NOT EXISTS (SELECT 1 FROM Course c INNER JOIN inserted i ON c.CourseID = i.CourseID)
RAISERROR('Invalid CourseID', 16, 1)
ELSE
INSERT INTO Enrollment (EnrollmentID, CourseID, StudentID)
SELECT EnrollmentID, CourseID, StudentID FROM inserted;
END;
```
在这个触发器中,我们使用了 INSTEAD OF INSERT 触发器,以便在 INSERT 语句执行之前拦截它。然后,我们检查插入的数据是否与学生表和课程表中的数据匹配。如果插入的数据无效,则触发器会引发一个错误。否则,它将允许 INSERT 语句执行,并向注册表中插入数据。
这个受限制的插入触发器可以确保注册表中只包含有效的学生和课程。如果尝试向注册表中插入无效的数据,触发器将阻止该操作并引发错误。
阅读全文