简介:郑州大学数据库原理实验报告是一份面向《数据库系统原理》课程的完整实验材料,适合计算机类本科生及需要熟悉DBMS操作的初学者。报告覆盖认识DBMS系统、万里数据库GreatSQL安装与使用、操作系统环境配置等核心环节,详细记录了关闭SELinux与防火墙、安装依赖包、部署GreatSQL服务及验证启动状态的全过程,并对实验结果进行反思与分析。压缩包内含1个docx格式实验报告文档,文件大小3.69MB,报告包含实验目的、内容、类型、学时分配、实验过程截图及图题表格,结构规范,便于参照练习。已有507人学习下载,适用于郑州大学相关课程实验参考,也可作为其他高校数据库原理实验的借鉴模板。读者可从中获取详细的命令操作记录、配置原因说明和问题排查思路,有助于快速搭建数据库实验平台并掌握实验报告撰写规范。
1. 数据库原理实验报告:ZZU计算机学生的第一份“数据库交付物”
“数据库原理实验报告”这个标题,在郑州大学信息工程学院或软件学院的课表里,意味着学期最后两周的密集劳作:画一张ER图,建三张表,再跑通二十几句SELECT,最后把过程写成一份老师看得过眼的报告。很多人把它当成走流程,但复试简历上能拿出来的数据库实践,往往就是这份报告。这门课考的不是范式定义的背诵,而是从概念模型到物理实现的全链路动手能力。下面按环境搭建、ER设计、SQL实现、报告规范和排错的顺序,整理一条能照着复现的完整路线,覆盖新手和准备考研复试的在校生。
2. 把实验环境搭到“能复现”:MySQL、Navicat与三表样例库
2.1 为什么用MySQL 8.0而不是SQL Server:教材、语法与环境三者对齐
郑州大学的数据库原理课程多选用宋金玉等编写的《数据库原理与应用》教材,实验环节的核心是“学生-课程-选课”三表模型。常见做法是实验室预装MySQL 8.0和Navicat客户端,一台Windows机器就能完成全部实验。我用过的组合是MySQL的8.0系列加Navicat(16或更新的版本都可以,DBeaver开源版也行),这套组合有两个好处:一是SQL语法与教材示例几乎一致,二是从命令行到图形界面的切换成本低。SQL Server虽然在Windows上有天然的图形化优势,但它的T-SQL语法和教材里的标准SQL有差异,在写视图实验时容易碰到“WITH CHECK OPTION”这类只在标准SQL里讲得透彻的细节。另外MySQL 8.0在Linux服务器上也能跑同一套SQL文件,后面做课程设计要部署到云主机时不用改代码。
如果实验室机器较旧,也可以退到MySQL 5.7,但要注意8.0的默认认证插件是caching_sha2_password,5.7用的还是mysql_native_password,Navicat连8.0时版本太旧会报“Authentication plugin”错误,这一点后面第5章会专门讲。环境装好后,第一步是用图形终端确认能连上本机的3306端口,确认服务没有启动失败。Windows上最常见的翻车是MySQL服务安装后没启动,任务管理器里看不到进程,却以为是连接配置写错了。
2.2 初始化“学生-课程-选课”三表数据库:可复现的建表脚本
实验报告第一步需求是建库建表。建议用SQL脚本一次完成,不要手工在Navicat里点着建,因为脚本可以反复执行、提交到实验报告附页里也方便老师复核。下面这份脚本是我常用的最小结构,直接拷贝到Navicat的查询编辑器里运行即可。
-- 创建实验数据库,显式指定utf8mb4,避免中文乱码 CREATE DATABASE IF NOT EXISTS school_lab DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE school_lab; -- 学生表:sno为主键,sage设为无符号TINYINT,压缩存储 CREATE TABLE student ( sno CHAR(20) PRIMARY KEY COMMENT '学号', sname VARCHAR(50) NOT NULL COMMENT '姓名', ssex CHAR(2) DEFAULT '男' COMMENT '性别', sage TINYINT UNSIGNED COMMENT '年龄', sdept VARCHAR(50) COMMENT '院系' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 课程表:cno为主键,cpno为先修课号,自引用外键 CREATE TABLE course ( cno CHAR(10) PRIMARY KEY COMMENT '课程号', cname VARCHAR(50) NOT NULL COMMENT '课程名', cpno CHAR(10) COMMENT '先修课号', ccredit SMALLINT CHECK (ccredit > 0) COMMENT '学分', CONSTRAINT fk_course_cpno FOREIGN KEY (cpno) REFERENCES course(cno) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- 选课表:联合主键(sno, cno),两个外键联到上面两张表 CREATE TABLE sc ( sno CHAR(20) NOT NULL COMMENT '学号', cno CHAR(10) NOT NULL COMMENT '课程号', grade DECIMAL(5,2) COMMENT '成绩', PRIMARY KEY (sno, cno), CONSTRAINT fk_sc_student FOREIGN KEY (sno) REFERENCES student(sno) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT fk_sc_course FOREIGN KEY (cno) REFERENCES course(cno) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;几个值得注意的参数:字符集选utf8mb4而不是utf8,原因是utf8在MySQL里最多只能存3字节,遇到生僻字或Emoji会插入失败,实验数据里也许用不上,但习惯要养对。sage用TINYINT UNSIGNED,占1字节,范围0到255,存年龄足够。grade用DECIMAL(5,2),最多3位整数2位小数,能容纳100以内的带小数成绩。外键用了ON DELETE CASCADE和ON UPDATE CASCADE,这是教材里隐性要求、实验报告里必须写清楚的级联行为:删除学生或课程时,选课记录自动清掉;改动学号时,选课表里的学号跟着更新——这正是关系完整性约束的直观展示。
建完表后,用SHOW CREATE TABLE student核对结构,再去information_schema里看一眼所有表是否都成功创建。这条命令在Navicat的查询窗口跑,输出会显示完整建表语句,能帮你确认约束有没有漏写。
2.3 造测试数据:手工INSERT之外,给一段批量生成脚本
造数这件事,血泪经验是“宁缺勿乱”。有的同学为了撑篇幅,往数据库里插两千条随机数据,结果查询结果一截图,满屏的数字像雪花一样,老师反而觉得你在凑数。常见做法是插入20到50条学生数据、8到10门课程、覆盖全选的选课记录,让每个查询都能看到至少一行结果就行。手工一条条INSERT写起来慢,这里给一个用数字辅助表批量生成学生数据的脚本。
-- 清空旧数据,方便重复执行 SET FOREIGN_KEY_CHECKS = 0; TRUNCATE TABLE sc; TRUNCATE TABLE course; TRUNCATE TABLE student; SET FOREIGN_KEY_CHECKS = 1; -- 课程数据:手工维护5门课,注意先修课的插入顺序 INSERT INTO course (cno, cname, cpno, ccredit) VALUES ('C01', '数据库原理', NULL, 4), ('C02', '数据结构', NULL, 4), ('C03', '操作系统', 'C02', 3), ('C04', '计算机网络', NULL, 3), ('C05', '软件工程', 'C01', 2); -- 用数字序列生成32条学生记录 INSERT INTO student (sno, sname, ssex, sage, sdept) SELECT CONCAT('2023', LPAD(n, 3, '0')) AS sno, CONCAT('学生', LPAD(n, 2, '0')) AS sname, IF(n % 2 = 0, '男', '女') AS ssex, FLOOR(18 + RAND() * 5) AS sage, ELT(1 + (n % 4), '计算机学院', '软件学院', '信息工程学院', '数学与统计学院') AS sdept FROM ( SELECT ones.n + tens.n * 10 + 1 AS n FROM (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) ones, (SELECT 0 n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3) tens ) nums ORDER BY n LIMIT 32; -- 选课数据:手写4条,覆盖不同学生选不同课程 INSERT INTO sc (sno, cno, grade) VALUES ('2023001', 'C01', 85.50), ('2023001', 'C02', 79.00), ('2023002', 'C01', 91.00), ('2023002', 'C03', 68.50);这里解释一下核心逻辑。SET FOREIGN_KEY_CHECKS = 0是为了TRUNCATE时不被外键拦住,跑完再打开,这一步在重复执行脚本时尤其重要。课程表只插5门,因为样例查询不需要太多;学生表用两个SELECT分别构造0到9和0到3的数字序列,交叉后得到40个序号,加LIMIT 32截断,LPAD补零生成学号和姓名,IF与ELT函数按余数分配性别和院系,RAND()随机生成18到22之间的年龄。选课表只插4行,避免后面写JOIN查询时结果太多难截图。
这种造数方式有一个“玄学”点:RAND()每次执行结果不同,如果想让报告截图里的数据前后一致,建议生成后立刻把数据导出成固定的INSERT语句,或者干脆把RAND()去掉,直接用一组写死的年龄值(如18、19、22、20、21)。我在实操中吃过这个亏:数据每次重跑不一样,截图里一个年龄是18,下一次成了21,报告前后对不上,只能重新截图。
2.4 环境自检:连接字符集与早期发现的乱码隐患
环境搭好后,先别急着写报告,用一条简单查询验证三张表和中文显示:SELECT * FROM student LIMIT 5。如果这一步中文姓名显示成问号或“学生??”,说明字符集没对齐,早发现早处理。检查字符集的常用命令是SHOW VARIABLES LIKE 'character%',看到character_set_server是utf8mb4,基本可以放心。后续如果要用Java写课程设计,JDBC连接URL记得显式加characterEncoding=utf8mb4,不然驱动默认编码在MySQL 5.7下有时会把4字节字符打断。
3. 从ER图到SQL落地:关系模式转换与三表查询的实战细节
3.1 概念结构设计:ER图要画到哪一层才不算偷懒
实验报告的第一张核心图片是ER图。郑州大学的数据库原理课程实验指导书会要求画出学生选课系统的ER图,常见实体是“学生”“课程”,联系是“选修”,一个M:N联系。画图工具不限制,但报告打印出来后,手画线条必须直、椭圆必须圆,用Visio或ProcessOn拉出来的图更容易过审。这里给一个“不算偷懒”的最低标准:实体用矩形并标注主键属性;联系用菱形,两端标上1和N,M:N联系单独注明;每个属性都连接到所属实体,至少保证学号、姓名、课程号、课程名、成绩这几个属性不出现在错误的位置。
很多同学把ER图画成“一棵竖着的圣诞树”,学生实体在上面,属性像挂灯一样垂下来。实际上规范的画法是把实体放中间,属性分布在两侧,每个属性用直线连到实体上。如果实体之间的关系超过三个,连线难免交叉,这时最好把关系密切的实体聚类,把“选修”这个菱形放在学生和课程中间,而不是塞到角落。
3.2 逻辑结构设计:实体与联系转关系模式的四条规则
从ER图到关系模式,教材里的转换规则可以浓缩成三条:每个实体转一张表;1:1和1:N联系把一端主键并入另一端实体表;M:N联系单独成一张表,主键是两端主键的联合。学生和课程之间的“选修”是M:N,所以SC表单独成表,主键为(sno, cno),同时sno和cno分别作为外键。
写实验报告时,关系模式要用形如“学生(学号,姓名,性别,年龄,院系)”“选课(学号,课程号,成绩)”的记号写清楚,主键加下划线,外键用波浪线或注释说明。这一步如果出错,后面的建表一定跟着错。最容易翻车的点是把“成绩”属性挂到学生实体上,这会导致部分依赖,后面第4章的范式检查会专门讲。
我在实际批阅中见过一个高频错误:把课程之间的“先修”关系画成选修联系的一部分,导致SC表里多出一个cpno字段,查询“先修课成绩”时逻辑乱成一锅粥。正确的做法是“先修”是课程实体内部的自反联系,只在course表中保留cpno字段表达先修课号即可,不需要新建表,也不需要在SC表里体现。
3.3 必考的三表查询:SELECT、JOIN与GROUP BY的配合
实验数据库一旦建好,最常考的实验题就是各种SELECT查询。建议按一个固定的顺序在报告中呈现:单表查询、连接查询、分组统计、嵌套查询。下面是三组在ZZU实验里出现频率最高的查询,可以直接写进报告并附执行结果。
-- 查询一:连接查询 —— 找出选修了“数据库原理”的学生姓名和成绩 SELECT s.sname, sc.grade FROM student s JOIN sc ON s.sno = sc.sno JOIN course c ON sc.cno = c.cno WHERE c.cname = '数据库原理' ORDER BY sc.grade DESC; -- 查询二:分组统计 —— 统计每门课程的选课人数和平均分 SELECT c.cno, c.cname, COUNT(*) AS 选课人数, AVG(sc.grade) AS 平均分 FROM course c LEFT JOIN sc ON c.cno = sc.cno GROUP BY c.cno, c.cname HAVING COUNT(*) > 0 ORDER BY 平均分 DESC; -- 查询三:嵌套查询 —— 找出成绩高于“2023001”所有课程平均分的学生 SELECT DISTINCT s.sname FROM student s JOIN sc ON s.sno = sc.sno WHERE sc.grade > ( SELECT AVG(grade) FROM sc WHERE sno = '2023001' );第一个查询用三表JOIN,表别名s、sc、c是阅读SQL的标配,报告里尽量别写不带别名的长查询。第二个查询的LEFT JOIN是关键:课程表可能没有选课记录,LEFT JOIN保证没有学生的课程也能统计出选课人数0,如果换成INNER JOIN,零选课课程会直接消失。GROUP BY后面跟的列要与SELECT中的非聚合列完全一致,MySQL允许只按cno分组,但为了报告严谨,把cname也放进去。HAVING COUNT(*) > 0在这里过滤掉没有任何选课记录的课程,如果想保留它们并显示0人,把HAVING去掉即可。第三个查询的子查询先算指定学生所有课程的平均分,外层再用大于号比较,注意子查询返回的是单个值,如果“2023001”没有任何选课记录,AVG会返回NULL,外层查询会空转——这是一个隐藏的坑。
写完这三个查询,报告还要留一页放UPDATE、DELETE、视图和索引的内容,这是实验指导书里常见的后几道题。视图的创建语句也建议用CREATE VIEW v_student_grade AS SELECT ...的格式,然后通过SELECT * FROM v_student_grade验证视图可查。
3.4 索引与事务:实验报告里常被忽略的加分项
许多同学做到查询就停手了,其实实验指导书的最后一步往往是给表建立索引并观察执行计划。一个常见的加分写法是:在sc表的grade列建立普通索引,用EXPLAIN SELECT看查询是否走索引。这里给出一个最小演示:
-- 创建索引 CREATE INDEX idx_sc_grade ON sc(grade); -- 验证执行计划是否走索引 EXPLAIN SELECT * FROM sc WHERE grade > 80; -- 事务演示:插入一条数据后回滚 START TRANSACTION; INSERT INTO sc (sno, cno, grade) VALUES ('2023009', 'C99', 100); ROLLBACK; -- 回滚后验证数据不存在 SELECT * FROM sc WHERE sno = '2023009' AND cno = 'C99';EXPLAIN的输出里,type字段从ALL变成range或ref,是索引生效的最直观证据。事务部分,START TRANSACTION之后执行的INSERT不会立刻写入磁盘,直到COMMIT或ROLLBACK。这段代码贴进报告,能明显提高实验完整度,但注意事务实验的ROLLBACK一定要写明“最后一行SELECT结果为空”,否则老师不知道你到底回滚没有。
4. 实验报告的结构、截图规范与三大范式检查
4.1 报告结构模板:从实验目的到结果分析的五段式
数据库原理实验报告的评分权重通常落在“结果是否可复现”和“分析是否真实”上。最稳的结构是五段式:实验目的(两句话写明本次验证的知识点)、实验环境(操作系统、MySQL版本、客户端版本)、实验步骤与结果(每个实验题:题目原文、SQL代码、执行结果截图、一句结果说明)、遇到的问题与解决(2到4条真实踩坑记录)、实验总结(收获与不足)。中间第3部分占整篇报告70%以上的篇幅,是老师扫一眼的着力点。
实验步骤里有一个常见误区:把SQL代码全放完再统一放截图,导致图文对不上。正确做法是一个题目一个代码块紧跟一个截图,截图只用红框标出关键输出(比如查询结果的行数、某个计算结果),不要整张屏幕全截。截图命名建议按“学号_题号”规则,例如“2023001_3.1.png”,粘贴到Word时排版不乱。
4.2 截图与执行结果的规范:三条肉眼可检验的标准
结果展示有三条标准:看得见、对得上、数得清。看得见是说截图分辨率不能太小,Windows下用Win+Shift+S截图后粘贴到Word,再缩放到文字能辨认的大小;对得上是指截图的SQL语句要和上方代码块的SQL完全一致,不能出现代码里写的WHERE grade>80,截图里却显示grade>=80这种不一致;数得清是指查询结果数量要和报告描述的完全吻合,比如报告写“查询结果为3行”,截图里也必须是3行,不能是多跑了前面的另一个查询的遗留结果。
报告写作上有一条血泪经验:不要为了截图好看去手工改数据库数据。有的同学为了让某个查询结果“看起来合理”,临时UPDATE成绩,结果其他查询的输出全乱套了。正确做法是先定好10组左右的初始数据,让它们能覆盖“最高分、最低分、平均分、空表”等边界,再写查询,最后统一跑一遍出截图。数据一旦固定,后面所有题目都不要改库,只改查询。
4.3 三大范式检查:交报告前用10分钟自查设计冗余
范式是数据库原理课的核心考点,实验报告的意义就在于把范式落到表结构上。交报告前建议对照三个检查点自查一遍。
第一个检查点是第一范式(1NF):所有属性是否都是不可再分的原子值。比如一个学生有两个电话号码,不要存成“13812345678,13912345678”一个字段,而应该拆成多值属性或新建联系表。
第二个检查点是第二范式(2NF):非主属性是否完全依赖联合主键。在SC表中,主键是(sno, cno),如果这里把sname也存进来,sname只依赖sno,不依赖cno,就构成部分依赖。实验报告里最经典的反面教材就是“选课表里存学生姓名”,这会直接扣掉范式分析的分。
第三个检查点是第三范式(3NF):非主属性之间是否有传递依赖。例如把“系主任”存进学生表,系主任依赖于系名,系名依赖于学号,出现传递依赖,应该拆成“院系(系名,系主任)”和“学生(学号,姓名,系名)”两张表。
自查结果可以直接写进实验报告的“遇到的问题”里,例如“我在设计初期将sname放进了SC表,经过2NF检查后发现sname只依赖sno,属于部分依赖,于是移除”。这种真实的分析比任何漂亮话都加分。
5. 高频踩坑与排查:连接失败、中文乱码、外键约束与ER图布局
5.1 MySQL 8.0连接Navicat失败:Authentication plugin报错
现象:Navicat点击连接,提示“Authentication plugin 'caching_sha2_password' cannot be loaded”或“Client does not support authentication protocol requested by server”。原因:MySQL 8.0的默认认证插件改成了caching_sha2_password,而使用的Navicat版本发布早于8.0或不支持该插件。解决:把用户的认证方式改回mysql_native_password即可。
-- 在MySQL命令行或Navicat的查询窗口执行 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES;执行后断开重新连接,问题消失。这里有个玄学点:如果登录的是远程主机,'root'@'localhost'要先改成对应的host值,否则ALTER USER影响不到那个用户。在实验报告里遇到这类问题,把报错信息和这两条SQL写进“遇到的问题”一节,比一句“百度解决了”更有工程价值。
5.2 插入中文变成问号或“???”
现象:INSERT语句执行成功,SELECT查出来中文全是问号。原因:三层字符集有一层不是utf8mb4,分别是客户端连接字符集、表结构字符集、数据库默认字符集。解决:建库时显式指定DEFAULT CHARACTER SET utf8mb4,连接时在Navicat的“高级”设置里把编码改成UTF-8,表结构已经建错的用ALTER TABLE修改。
-- 对已有表批量修正字符集 ALTER TABLE student CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE course CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ALTER TABLE sc CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;命令行登录MySQL时,启动参数记得加--default-character-set=utf8mb4,否则服务端返回中文时终端一样会乱码。乱码问题的排查顺序是:先SHOW VARIABLES LIKE 'character_set_server',再查表的字符集,最后查连接串,三层统一后基本能解决。
5.3 外键约束导致INSERT或DELETE失败:先插父表还是子表
现象:向SC表插入一条学号在student表里不存在的记录,报错“Cannot add or update a child row”。原因:外键约束要求子表的关联值必须存在于父表。解决:严格遵循先父后子的插入顺序;删除时先删子表再删父表。还有一种临时做法是SET FOREIGN_KEY_CHECKS = 0跳过约束检查,但这不能写进实验报告当作“正解”,因为这样做掩盖了约束本身的意义,老师看到了反而会问为什么。
注意:SET FOREIGN_KEY_CHECKS = 0只能用于演示环境,实验报告中不要把它当作解决外键冲突的常规手段。你真正要展示的是对约束的理解。
更隐蔽的一个坑是ON UPDATE CASCADE的使用:如果改了student表的sno,sc表会自动追随更新。但如果sc表里还有另一条数据没有被级联覆盖,UPDATE会失败。报告中演示级联更新时,先把数据造干净,再用一条UPDATE student SET sno='2023999' WHERE sno='2023001',随后SELECT * FROM sc验证级联效果。
5.4 ER图连线交叉成“蜘蛛网”:布局与画法建议
现象:实体不多,但关系线和属性线乱成一团,打印出来根本看不清。原因:实体摆放位置随意,属性绕着实体一圈分布,连线和关系线叠加在一起。解决:画图前先定好布局——核心实体(学生、课程)放中央,联系(选修)放在两者之间,次要属性列在实体两侧,线与线之间留出空隙。在ProcessOn里可以用“布局”功能自动整理,Visio里可以用“重新布局页面”按钮,手动拖动后看交叉点是否减少到3个以内。报告中ER图占半页纸,不要把图缩到一行大小,否则批阅者放大都看不清。
5.5 查询结果为空:是真的没数据还是条件写错
现象:一条看起来必然有结果的SELECT,跑了半天返回Empty set,截图贴上去很尴尬。原因:要么造数时漏插了对应记录,要么WHERE条件里的字段名和表结构对不上(比如sno写成了sid),要么数据类型不匹配(CHAR类型的学号传了数字类型,MySQL隐式转换后匹配不上)。解决:分三步排查。第一步去掉WHERE子句跑SELECT * FROM 表名,确认表里有没有数据;第二步用DESC table_name核对字段名;第三步把条件字面量用单引号包起来,例如WHERE sno = '2023001',避免数值与字符串比较引发的隐式转换。完成排查后再重跑并截图。
6. 交报告前三十分钟:自检SQL、一致性核对与归档技巧
到这一步,报告通常已写完,但还差最后一道工序:验证你的SQL结果在换一台机器、换一个数据库实例之后仍然能复现。我习惯在交之前跑三个自检SQL,它们能快速暴露低级错误:
-- 自检1:外键完整性,找出sc表中孤儿记录 SELECT * FROM sc WHERE sno NOT IN (SELECT sno FROM student) OR cno NOT IN (SELECT cno FROM course); -- 自检2:成绩边界,找出超出0-100范围的值 SELECT sno, cno, grade FROM sc WHERE grade < 0 OR grade > 100; -- 自检3:三表的行数清单,确认造数规模与报告描述一致 SELECT 'student' AS tbl, COUNT(*) AS cnt FROM student UNION ALL SELECT 'course', COUNT(*) FROM course UNION ALL SELECT 'sc', COUNT(*) FROM sc;第一个自检查外键孤儿记录,返回0行说明外键约束完整;第二个自检查成绩越界,同样要求返回0行;第三个自检的行数要与报告里写的“共有学生xx人、课程xx门、选课xx行”一致。自检跑完后,把SQL源码连同实验数据库导出成一个school_lab.sql文件,文件里保留建库、建表、插入和全部实验查询,作为报告的附件一起上传。导出命令写在报告里时注意不要带密码,写成mysqldump -u root -p school_lab > school_lab.sql,执行后交互输入密码即可,别把口令留在Word里。
另一个收尾技巧是给报告加一段“复现说明”,写在实验总结之前,内容不超过五句话:环境版本、运行方式(用Navicat打开school_lab.sql执行)、预期输出(三张表行数、关键查询结果的行数)。这段说明对助教和老师来说非常友好,也等于给你的报告加了诚信背书。
说回我自己,带过几届实习后养成了一个习惯:交任何数据库实验报告前,一定亲手删库重跑一遍脚本,看着错误列表里一个错误都没有,才把截图放进去。这是个笨办法,但比任何“再检查一遍”都可靠。希望这份路线和排错清单能帮你少走几个弯路。
本文还有配套的精品资源,点击获取