SQL SERVER有表学生(学号,年龄,性别,系名) 课程(课号,课名,学分,学时) 选课(学号,课号,成绩)要求建立学生表的delete触发器,若选课表中该生有选课记录,则拒绝删除,要求在删除学生信息同时,将相关表中的信息全部删除。
时间: 2023-12-06 14:03:24 浏览: 155
14、为学生表创建触发器,要求: (1)当用户成功删除该表中的一条或多条记录时,触发器自动删
好的,以下是基于您提供的表结构和要求所编写的 SQL Server 代码:
```sql
-- 创建 `学生` 表
CREATE TABLE [学生] (
[学号] INT NOT NULL,
[年龄] INT NOT NULL,
[性别] VARCHAR(10) NOT NULL,
[系名] VARCHAR(20) NOT NULL,
PRIMARY KEY ([学号])
);
-- 创建 `课程` 表
CREATE TABLE [课程] (
[课号] INT NOT NULL,
[课名] VARCHAR(20) NOT NULL,
[学分] INT NOT NULL,
[学时] INT NOT NULL,
PRIMARY KEY ([课号])
);
-- 创建 `选课` 表
CREATE TABLE [选课] (
[学号] INT NOT NULL,
[课号] INT NOT NULL,
[成绩] INT NOT NULL,
PRIMARY KEY ([学号], [课号]),
FOREIGN KEY ([学号]) REFERENCES [学生] ([学号]),
FOREIGN KEY ([课号]) REFERENCES [课程] ([课号])
);
-- 创建 `删除学生` 触发器
CREATE TRIGGER [删除学生] ON [学生] INSTEAD OF DELETE AS
BEGIN
-- 检查是否有选课记录,如果有则拒绝删除
IF EXISTS (SELECT * FROM [选课] WHERE [学号] IN (SELECT [学号] FROM DELETED)) BEGIN
RAISERROR ('该学生有选课记录,不能删除!', 16, 1);
END
ELSE BEGIN
-- 同时删除相关表中的信息
DELETE FROM [选课] WHERE [学号] IN (SELECT [学号] FROM DELETED);
DELETE FROM [课程] WHERE [学号] IN (SELECT [学号] FROM DELETED);
DELETE FROM [学生] WHERE [学号] IN (SELECT [学号] FROM DELETED);
END
END;
```
触发器的作用是在删除学生信息之前检查是否有选课记录,如果有则拒绝删除,否则同时删除相关表中的信息。这里使用了 `INSTEAD OF DELETE` 触发器,它会在执行删除操作时自动触发。在触发器中,可以通过 `DELETED` 表获取即将被删除的行的值。
同时,在触发器中使用了 `RAISERROR` 语句来抛出一个自定义的错误信息,以阻止删除操作。如果没有选课记录,则通过 `DELETE` 语句删除相关表中的信息。
需要注意的是,这里使用了外键约束来保证数据的完整性,即 `选课` 表中的 `学号` 和 `课号` 必须分别对应于 `学生` 表和 `课程` 表中的主键。如果您的数据库中已经定义了外键约束,则不需要在触发器中再次检查这些约束。
阅读全文