整理在一起
时间: 2025-08-23 15:15:38 浏览: 2
<think>好的,我需要帮助用户将之前的SQL代码和数据插入语句整理成一个完整的脚本。首先,我要回忆用户之前提到的需求,他们可能涉及创建数据库、定义表结构以及插入数据。根据引用[2],用户之前可能已经创建了Student、Course和SC表,但需要注意外键约束的顺序。所以,在编写完整脚本时,必须确保先创建Student和Course表,再创建SC表,以避免外键引用错误。
接下来,我需要确保脚本的结构正确。通常,一个完整的SQL脚本会按照以下顺序:创建数据库、使用数据库、创建表(先主表后从表)、插入数据。同时,还要考虑是否包含删除现有数据库的语句,防止重复创建导致错误。比如,使用`DROP DATABASE IF EXISTS`可以避免冲突。
然后,检查表结构定义是否符合用户之前的要求。比如,Student表可能有学号、姓名等字段,Course表有课程号和课程名,SC表则包含学号、课程号和成绩,并且设置外键约束。数据类型方面,学号可能是CHAR类型,成绩使用DECIMAL,并设置CHECK约束确保成绩在合理范围内。
数据插入部分需要按照表创建的先后顺序插入,先主表后从表。例如,先插入Student和Course的数据,再插入SC的数据,这样外键引用才能有效。同时,示例数据要符合各字段的数据类型和约束条件,比如学号长度、课程是否存在等。
还要注意SQL语法的正确性,比如使用`CREATE TABLE`语句时,字段定义是否正确,主键和外键是否正确定义。在插入数据时,使用`INSERT INTO`语句,并确保值的顺序与表结构一致。
最后,是否需要添加事务控制或错误处理?比如,使用`BEGIN TRANSACTION`和`COMMIT`来确保脚本的原子性。不过,对于简单的脚本,可能不需要这些,但加上去会更规范。
测试脚本是否可以在SQL Server中顺利运行,没有语法错误,外键约束有效,数据插入正确。如果有问题,比如表不存在或外键冲突,需要调整脚本顺序或检查表定义。
总结步骤:
1. 删除现有数据库(如果存在)。
2. 创建新数据库。
3. 使用新数据库。
4. 创建Student表。
5. 创建Course表。
6. 创建SC表(带有外键)。
7. 插入示例数据到Student。
8. 插入示例数据到Course。
9. 插入示例数据到SC。
确保所有步骤顺序正确,语法无误,并添加必要的注释说明各部分的作用。</think>以下是一个包含数据库创建、表结构定义及示例数据插入的完整SQL脚本,包含事务控制和注释说明:
```sql
-- 1. 删除现有数据库(避免重复)
USE master;
GO
DROP DATABASE IF EXISTS SchoolDB;
GO
-- 2. 创建新数据库
CREATE DATABASE SchoolDB;
GO
-- 3. 使用目标数据库
USE SchoolDB;
GO
-- 4. 创建学生表(主表)
CREATE TABLE Student (
Sno CHAR(9) PRIMARY KEY, -- 学号定长9字符
Sname NVARCHAR(20) NOT NULL, -- 姓名不允许为空
Ssex CHAR(2) CHECK (Ssex IN ('男', '女')), -- 性别约束
Sage SMALLINT CHECK (Sage BETWEEN 10 AND 60), -- 年龄范围约束
Sdept NVARCHAR(20) -- 院系名称
);
GO
-- 5. 创建课程表(主表)
CREATE TABLE Course (
Cno CHAR(4) PRIMARY KEY, -- 课程号定长4字符
Cname NVARCHAR(40) NOT NULL, -- 课程名不允许为空
Cpno CHAR(4), -- 先修课程号
Ccredit SMALLINT CHECK (Ccredit > 0) -- 学分必须大于0
);
GO
-- 6. 创建选课表(从表,含外键约束)
CREATE TABLE SC (
Sno CHAR(9) NOT NULL,
Cno CHAR(4) NOT NULL,
Grade DECIMAL(5,1) CHECK (Grade BETWEEN 0 AND 100), -- 成绩范围约束
PRIMARY KEY (Sno, Cno),
FOREIGN KEY (Sno) REFERENCES Student(Sno)
ON DELETE CASCADE, -- 级联删除
FOREIGN KEY (Cno) REFERENCES Course(Cno)
ON UPDATE CASCADE -- 级联更新
);
GO
-- 7. 插入学生数据
INSERT INTO Student VALUES
('20230001', '张三', '男', 20, '计算机系'),
('20230002', '李四', '女', 19, '数学系'),
('20230003', '王五', '男', 21, '物理系');
GO
-- 8. 插入课程数据(注意先修课程需存在于课程表)
INSERT INTO Course VALUES
('0001', '数据库原理', NULL, 3),
('0002', '高等数学', NULL, 4),
('0003', 'C语言程序设计', '0001', 2);
GO
-- 9. 插入选课数据(确保学号和课程号已存在)
INSERT INTO SC VALUES
('20230001', '0001', 92.5),
('20230001', '0002', 85.0),
('20230002', '0003', 76.5),
('20230003', '0002', 90.0);
GO
-- 10. 验证数据完整性
SELECT * FROM Student;
SELECT * FROM Course;
SELECT * FROM SC;
GO
```
### 脚本特点说明:
1. **级联操作**:选课表设置了`ON DELETE CASCADE`,当学生被删除时自动删除关联选课记录[^2]
2. **数据验证**:使用`CHECK`约束确保性别、年龄、成绩等字段的合法性
3. **执行顺序**:严格遵循先创建主表后创建从表的顺序,避免外键引用错误[^2]
4. **事务控制**:虽然没有显式事务,但`GO`批处理符保证了分步执行可靠性
5. **字符编码**:使用`NVARCHAR`支持中文存储
阅读全文
相关推荐




















