openGauss数据库实验报告:九次递进实验与避坑验收

发布时间:2026/10/27 20:00:29

openGauss数据库实验报告:九次递进实验与避坑验收 简介这份《数据库系统原理实验》报告文档面向计算机科学与技术、软件工程等专业学生适配数据库课程实验、期末复盘与报告撰写参考。内容围绕 openGauss 与 gsql 环境展开涵盖认识 DBMS、创建数据库表与索引、交互式 SQL、视图、完整性控制、安全性控制、事务与并发控制、备份恢复以及 JDBC 连接数据库等九个实验模块并记录安装启动、用户创建、权限分配、锁机制与数据恢复等实践环节。压缩包内为 1 个 docx 文件约 3.23MB按实验目的、内容、步骤、问题与结果分析组织配有操作截图、图表编号和排版示例。已有 1525 人学习可作为梳理 SQL 操作、权限管理、并发控制与备份恢复思路的实操范本也便于对照检查实验记录是否完整、问题分析是否到位适合课程实验提交前参考和数据库知识点复习。1. 从九次实验倒推数据库实验报告真正难的是那条主线交数据库实验报告卡人的地方很少是 SELECT 写不出来而是九次实验之间那根线断了——第一次装完 openGauss 没记端口号和安装用户第二次建表时外键顺序对不上做到完整性控制才发现前面几张表的结构要推倒重来。这份数据库实验报告书把课程要求拆成九次递进实验认识 DBMS、建库建表建索引、交互式 SQL、视图、完整性控制、安全性控制、事务与并发、备份恢复、JDBC 连接全部落在 openGauss 上。它适合两类人赶课程设计节点的计算机类学生需要一套能直接对照的实验顺序和报告骨架以及要带实验课的助教需要一份可复现的验收口径。下面按这套顺序把每一步的取舍和命令写清楚照着走能省掉大量返工。2. 平台底座三条安装路线、gsql 元命令与一次环境固化实验一在报告里通常只有两三页但它决定了后面八次实验能不能顺利开工。装 openGauss 有三条路选错路线不会当场报错而是在你做到事务与并发那一次时才发现虚拟机动不动就卡死、连接时不时断掉。我一般让学生在动手前先确认三件事本机内存够不够、能不能接受重装系统、手上有没有可用的远程主机。这三个答案直接对应三种安装方式选完再动手别装到一半改主意。2.1 安装路线选型远程主机、一键镜像、openEuler 手工装三条路线的差别不只是耗时更在于出问题时你能不能自己定位。路线前置条件大致耗时适合谁主要风险远程主机安装有一台可登录的远程机器12 小时本机内存吃紧、机房机器老旧端口未放行、远程连接配置遗漏虚拟机一键镜像本机内存 8GB 以上40 分钟1 小时大多数做课程设计的人镜像与虚拟化软件版本不匹配openEuler 手工安装愿意折腾 Linux半天以上想把系统层一起练一遍依赖包缺失、内核参数未调优选型建议很直接如果只是为了把九次实验跑完、报告写完整走一键镜像最稳如果本机只有 4GB 内存虚拟机里跑数据库会频繁触发内存回收查询慢得像卡死这时候用远程主机更省心如果想借这门课把 Linux 也顺带练熟再考虑 openEuler 手工装但要做好多花半天时间的心理准备。不管走哪条路线安装完成后有三样信息必须立刻记在报告第一页安装用户是谁、数据目录在哪、端口号是多少。后面每次连接都要用到忘了就得从头翻日志。2.2 gsql 连接链路omm 用户、26000 端口与 -r 参数openGauss 安装完成后默认只有一个管理员用户服务也只能由这个用户启动。所以连接的第一步不是敲 gsql而是切用户。# 切换到数据库安装用户openGauss 的服务进程归属该用户 su - omm # 启动数据库服务-t 后面跟动作start 表示启动 gs_om -t start # 连接默认库 postgres26000 是主节点端口-r 打开命令历史 gsql -d postgres -p 26000 -r三个参数的用途要分清-d指定连哪个库安装完默认生成的是 postgres新库还没建时只能连它-p指定端口openGauss 默认主节点端口是 26000不写有时会落到别的默认端口上导致连不上-r让上下方向键能翻历史命令做实验三那种一长串查询时非常省事属于典型的后悔药。切用户这一步也别省用普通系统账号跑 gsql 会因为权限不足直接报错。连上之后实验一要求的了解数据库系统架构其实就体现在元命令上。这些命令不用背但报告里必须出现几个关键的输出元命令作用等价系统表查询用在哪个实验\l列出所有数据库select datname from pg_database;实验一、二\c dbname切换数据库无建完库切过去\dt列出当前库的表无实验二建完六张表核对\d tablename看表结构、约束、索引无几乎每个实验都要查\dn列出模式无实验二建 schema 后\di列出索引无实验二建索引后验证\db列出表空间select spcname from pg_tablespace;实验二建表空间后\du列出用户与角色select * from pg_roles;实验六授权后\h查 SQL 语法帮助无随时这里有一处容易写混的概念报告里辨析清楚能明显拉开档次用户是具体账号角色是权限的集合。建一个只读角色把若干查询权限挂上去再把角色分配给某个用户这个用户就一次性拿到了这批权限人员岗位变动时只改角色分配不用逐个权限重授。这也是实验六安全性控制的设计基础很多报告写到授权就只贴一条 GRANT缺的正是这层角色抽象。2.3 环境固化一份可复用的初始化脚本实验一最怕的是装完能用过两天虚拟机崩了前面所有建库建表的成果全部归零。血泪经验是把建表空间、建库、建应用账号这几步写成脚本重装后跑一遍五分钟回到可继续实验的状态。#!/bin/bash # 重装环境后跑一遍把实验二到实验六要用的库、用户、表空间一次性备好 set -e # 任何一步失败就停避免在半成品状态继续往下跑 PORT26000 DBdb_school APP_USERstu_app # 服务没起就先起已启动时该命令会直接返回 gs_om -t status /dev/null 21 || gs_om -t start # 建表空间目录必须事先存在且为空目录 gsql -d postgres -p $PORT -c CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1; # 建库并绑定默认表空间省得后面每张表单独指定 gsql -d postgres -p $PORT -c CREATE DATABASE $DB WITH TABLESPACE tpcds_local; # 建应用账号密码需满足强度要求大小写字母数字特殊字符长度不少于 8 位 gsql -d postgres -p $PORT -c CREATE USER $APP_USER IDENTIFIED BY Stu_App#2024; # 验证能看到新库就说明前面都成功了 gsql -d $DB -p $PORT -c \lset -e是这份脚本里最值钱的一行它保证建表空间失败时不会继续去建库否则你会得到一堆库建在默认表空间里的脏数据后面很难查。每条-c只执行一条语句失败时错误信息也干净。脚本里的密码只是示例openGauss 对弱密码会直接拒绝建用户报告里把这条限制写进去比单纯贴一句 CREATE USER 有信息量。提示表空间目录必须是已存在且为空的目录相对路径是相对数据库节点数据目录不是相对你当前所在的 shell 路径写错会报目录不存在。3. 库表与索引表空间、模式与六张核心表的建表顺序实验二看着只是把教材上的表抄一遍实际是整份报告最容易翻车的一节。原因在于六张表之间有循环参照教师表要记所属院系编号院系表又要记负责人教师编号。照着教材从上往下写第二条 CREATE TABLE 就会因为引用了还不存在的表而直接报错。解决办法不是改教材而是调整建表顺序把外键拆成两步加。3.1 表空间与数据库先划存储再建库最后改名存储位置要在建库之前定好建完再挪代价很大。-- 表空间相当于给这个库单独划一块存储位置便于后续管理 CREATE TABLESPACE tpcds_local RELATIVE LOCATION tablespace/tablespace_1; -- 建库时直接绑定表空间库里所有对象默认落在该位置 CREATE DATABASE db_sc WITH TABLESPACE tpcds_local; -- 库名起错了不用删库重来改名比重建安全得多 ALTER DATABASE db_sc RENAME TO db_school;RELATIVE LOCATION是相对数据目录的路径用绝对路径反而容易因为权限问题失败。改名前要确认没有活动连接否则会提示数据库正在被使用。改完之后执行\c db_school切过去后面的建表操作才落在正确的库里——这一点在报告中要单独写一句很多人建完库还在 postgres 下建表最后\dt查不到表以为是建表语句写错了。表空间、数据库、模式三者的关系建议在报告里画一段文字说明表空间管物理存储位置数据库管数据集合边界模式管命名空间。一个模式里放一组相关的表、视图、存储过程同一库里可以有多个互不干扰的模式。理解这三层实验二后面建 schema 的那几步才不会变成机械抄写。3.2 六张核心表的依赖顺序与外键回填六张表的依赖链条是院系与教师互指学生依赖院系课程独立选课依赖学生和课程授课依赖教师和课程。正确的顺序是先建教师表和院系表并把一侧外键留空再回填。-- 第一步两张互相引用的表先建出来Teachers 的外键暂时不写 CREATE TABLE Teachers ( Tno CHAR(20) PRIMARY KEY, Tname CHAR(20) NOT NULL, Sex CHAR(20) CHECK (Sex IN (男,女)), Birthday DATE, Title CHAR(20), Dno CHAR(20) -- 此处先不加外键等 Departments 建好再补 ); CREATE TABLE Departments ( Dno CHAR(20) PRIMARY KEY, Dname CHAR(20), Dheadno CHAR(20), FOREIGN KEY (Dheadno) REFERENCES Teachers(Tno) -- 教师表已存在可以直接加 ); -- 第二步两张表都在了再把 Teachers 缺的那条外键补上 ALTER TABLE Teachers ADD CONSTRAINT fk_teachers_dept FOREIGN KEY (Dno) REFERENCES Departments(Dno);这种先建表、后补约束的做法在真实项目里很常见报告里写清楚为什么这样做比直接贴一段能跑通的代码更有说服力。外键加上之后插入顺序也受约束必须先插院系或允许 Dno 为空再插教师删数据则相反。后面四张表按依赖顺序往下写CREATE TABLE Students ( Sno CHAR(20) PRIMARY KEY, Sname CHAR(20) NOT NULL, Sex CHAR(20) CHECK (Sex IN (男,女)), Birthday DATE, Enrollyear CHAR(20), Speciality CHAR(20), Dno CHAR(20), FOREIGN KEY (Dno) REFERENCES Departments(Dno) ); CREATE TABLE Courses ( Cno CHAR(20) PRIMARY KEY, Cname CHAR(20) NOT NULL, Period SMALLINT, Credit SMALLINT ); -- 选课表用复合主键一个学生对一门课只能有一条成绩记录 CREATE TABLE SC ( Sno CHAR(20), Cno CHAR(20), Grade SMALLINT CHECK (Grade BETWEEN 0 AND 100), PRIMARY KEY (Sno, Cno), FOREIGN KEY (Sno) REFERENCES Students(Sno), FOREIGN KEY (Cno) REFERENCES Courses(Cno) ); -- 授课表同样用复合主键同一门课不同学期可以由不同老师上 CREATE TABLE Teaches ( Tno CHAR(20), Cno CHAR(20), Term CHAR(20), PRIMARY KEY (Tno, Cno, Term), FOREIGN KEY (Tno) REFERENCES Teachers(Tno), FOREIGN KEY (Cno) REFERENCES Courses(Cno) );几个参数选择要在报告里交代清楚学号、课程号统一用CHAR(20)是照教材口径实际项目里通常换成VARCHAR(20)定长在长度差异大时会浪费空间学时和学分用SMALLINT足够取值范围完全覆盖成绩用SMALLINT而不是浮点避免出现 85.0000001 这种比较难题。每建完一张表立刻\d 表名核对字段和约束比全建完再查要省事得多。3.3 索引主键自动建业务索引要自己判断主键和唯一约束会自动生成索引这一点在\di里能直接看到。需要自己动手的是那些高频查询条件上的字段。-- 按院系查学生是最常见的场景在 Dno 上单独建索引 CREATE INDEX Student_Dept ON Students(Dno); -- 建完必须验证确认索引名、字段、所属表都对 \di -- 如果发现这个索引根本没被用到删掉也不影响功能 DROP INDEX Student_Dept;索引不是越多越好这一点报告里值得单独写一段索引加快检索但每次插入、更新、删除都要维护索引结构写多读少的表上堆索引是负收益。判断标准看执行计划EXPLAIN一下就能看出走的是全表扫描还是索引扫描。另外组合索引有最左前缀的限制(Dno, Speciality)这样的组合索引对只查 Speciality 的语句没用这一点常被忽略。4. 从查询到可恢复视图、完整性、安全性、事务与 JDBC 的六段落地实验三到实验九是一条连续的链每一环都压在前面的表结构上。这条链上真正需要想清楚的只有一件事约束放在哪一层。放在列上、放在表上、放在触发器里、放在应用代码里效果和代价完全不同。想清楚这一层后面六次实验的代码基本是自然长出来的。4.1 交互式 SQL把一次查询拆成四层来写实验三的 SQL 语句如果一上来就写多表连接很容易写到一半发现条件放错位置。我的做法是固定分成四层推进每层都能单独验证。-- 第一层单表筛选先把数据范围收窄 SELECT Sno, Sname, Speciality FROM Students WHERE Enrollyear 2021; -- 第二层连接把分散在两张表的属性拼回来 SELECT s.Sname, c.Cname, sc.Grade FROM Students s JOIN SC sc ON s.Sno sc.Sno JOIN Courses c ON sc.Cno c.Cno WHERE sc.Grade 85; -- 第三层聚合分组WHERE 过滤行HAVING 过滤组两者不能互换 SELECT c.Cno, c.Cname, AVG(sc.Grade) AS avg_grade, COUNT(*) AS cnt FROM Courses c JOIN SC sc ON c.Cno sc.Cno GROUP BY c.Cno, c.Cname HAVING AVG(sc.Grade) 80; -- 第四层子查询处理高于平均分这类需要先算基准的条件 SELECT Sno, Grade FROM SC WHERE Grade (SELECT AVG(Grade) FROM SC);第三层里GROUP BY后面必须带上所有未聚合的列漏掉c.Cname在严格模式下会直接报错WHERE里不能写聚合函数那是HAVING的活。第四层的标量子查询返回单值才能用比较如果子查询返回多行就要换成IN或ANY。这些点写进报告的分析段比只贴结果截图更能体现实验做透了。4.2 视图把复杂查询固化成可复用接口视图的价值在两个地方一是把三表连接这种长语句封成一个名字后面实验五、六反复用二是作为权限的边界只给视图权限不给基表权限。-- 把学生-课程-成绩的三表连接封成视图 CREATE VIEW v_student_score AS SELECT s.Sno, s.Sname, s.Speciality, c.Cname, sc.Grade FROM Students s JOIN SC sc ON s.Sno sc.Sno JOIN Courses c ON sc.Cno c.Cno; -- 带检查选项的视图通过视图写入时会校验 WHERE 条件 CREATE VIEW v_cs_student AS SELECT Sno, Sname, Speciality FROM Students WHERE Speciality 计算机 WITH CHECK OPTION;视图本身不存数据每次查询都会被重写成底层的 SELECT所以它不会带来性能提升带来的只是可维护性和权限隔离。能不能更新取决于视图定义单表、不含聚合和 DISTINCT 的简单视图通常可更新多表连接视图一般不可更新硬写 INSERT 会报错。WITH CHECK OPTION的作用是挡住插进去之后就查不出来的记录比如往上面的视图里插一条专业为软件工程的学生会被直接拒绝。实验四的报告里能把这两点说清楚基本就不会被追问。4.3 完整性控制列级约束、表级约束与触发器的边界三类完整性对应三组手段实体完整性靠主键参照完整性靠外键用户定义完整性靠 NOT NULL、DEFAULT、UNIQUE 和 CHECK。-- 涉及多列的 CHECK 只能写在表级约束起名字便于后续删除和排查 ALTER TABLE SC ADD CONSTRAINT ck_grade CHECK (Grade IS NULL OR (Grade BETWEEN 0 AND 100)); -- 参照完整性动作级联删除和级联更新删学生时他的选课记录跟着走 ALTER TABLE SC DROP CONSTRAINT sc_sno_fkey, ADD CONSTRAINT sc_sno_fkey FOREIGN KEY (Sno) REFERENCES Students(Sno) ON DELETE CASCADE ON UPDATE CASCADE;列级约束和表级约束的区别要在报告里写明列级写在字段后面、不用指定列名、不能起约束名表级写在所有字段之后、必须指明列名、可以起名字。涉及两个及以上字段的条件比如结束日期不能早于开始日期只能写成表级。有些约束 CHECK 表达不了比如一个学生最多选 8 门课因为它需要跨行统计。这类只能用触发器-- 限制单个学生最多选 8 门课跨行统计 CHECK 做不到 CREATE OR REPLACE FUNCTION fn_limit_sc() RETURNS TRIGGER AS $$ BEGIN IF (SELECT COUNT(*) FROM SC WHERE Sno NEW.Sno) 8 THEN RAISE EXCEPTION 选课门数超过上限; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_limit_sc BEFORE INSERT ON SC FOR EACH ROW EXECUTE PROCEDURE fn_limit_sc();触发器是典型的黑匣子逻辑藏在数据库里应用层看不见性能也不透明。报告里最好写一句取舍判断——能用声明式约束解决的绝不上触发器只有在跨行、跨表校验时才动用它。这句话体现的是设计意识不是语法能力。4.4 安全性控制用户、角色与最小权限实验六的核心不是把 GRANT 敲对而是想清楚谁能看什么。-- 先建角色权限集合再建用户具体账号最后把角色分配给用户 CREATE ROLE r_readonly; GRANT CONNECT ON DATABASE db_school TO r_readonly; GRANT USAGE ON SCHEMA public TO r_readonly; GRANT SELECT ON ALL TABLES IN SCHEMA public TO r_readonly; CREATE USER u_reader IDENTIFIED BY Read_Only#2024; GRANT r_readonly TO u_reader; -- 验证效果收回一张表的查询权再用新会话连上去试 REVOKE SELECT ON Students FROM r_readonly;这里有个默认权限的坑必须提public 模式在默认配置下对普通用户是开放的新建的用户可能天然就能建表看起来像权限没生效。报告里可以加一步验证用新用户连上去执行\dt能看表执行CREATE TABLE看是否被拒两种情况都要留截图。另外权限变更后旧会话不会自动刷新必须断开重连才能看到效果这一点在答辩时被问到过不止一次。4.5 事务与并发savepoint、隔离级别与锁等待事务这一节最好用转账场景讲比抽象的 BEGIN/COMMIT 直观得多。-- 转账扣款和入账必须同生共死中途失败要能只回滚一半 BEGIN; UPDATE Account SET balance balance - 100 WHERE ano A; SAVEPOINT sp1; UPDATE Account SET balance balance 100 WHERE ano B; -- 若 B 账号状态异常回滚到保存点而不是整笔撤销 ROLLBACK TO sp1; COMMIT;并发部分一定要开两个 gsql 窗口做单会话演示不出任何效果。一个会话BEGIN后更新某行但不提交另一个会话更新同一行会阻塞直到第一个会话 COMMIT 或 ROLLBACK。阻塞期间可以在第三个窗口查select * from pg_locks;看到锁等待这张截图是实验七最有说服力的证据。隔离级别用SET TRANSACTION ISOLATION LEVEL READ COMMITTED;切换然后在两个会话里分别验证不可重复读和幻读现象。报告里写清楚每种级别允许什么异常、openGauss 默认是哪一级比抄概念定义强得多。4.6 备份恢复与 JDBC两条出口实验八和实验九是两个方向的出口一个把数据搬出去再搬回来一个让程序接进来。# 逻辑备份整个库导出成 SQL 脚本 gs_dump -U omm -f /home/omm/backup/db_school.sql -p 26000 db_school # 只导结构用于快速核对建表语句 gs_dump -U omm -s -f /home/omm/backup/schema.sql -p 26000 db_school # 恢复到另一个库避免覆盖原库 gsql -d db_school_restore -p 26000 -f /home/omm/backup/db_school.sql备份做完必须真的恢复一次并且用count(*)对比行数。只备份不恢复等于没验证过——这是很多报告丢分的地方。// openGauss 的驱动类和 URL端口必须与 gsql 连接时一致 String url jdbc:opengauss://127.0.0.1:26000/db_school; String user stu_app; String pwd Stu_App#2024; try (Connection conn DriverManager.getConnection(url, user, pwd); PreparedStatement ps conn.prepareStatement( SELECT Sname, Grade FROM v_student_score WHERE Cname ?)) { ps.setString(1, 数据库原理); // 参数化避免拼接 SQL 带来的注入风险 try (ResultSet rs ps.executeQuery()) { while (rs.next()) { System.out.println(rs.getString(1) \t rs.getInt(2)); } } } catch (SQLException e) { // 连不上先查三处端口、驱动 jar 是否在 classpath、服务端是否允许远程连接 e.printStackTrace(); }JDBC 这一步卡住的人最多原因往往不在代码驱动 jar 没放进 classpath、URL 里的库名写错、服务端未允许远程连接、密码里的特殊字符被 shell 转义吃掉。报告里把这几条的排查顺序写出来比贴一段能跑的代码更有价值。PreparedStatement的占位符写法也要说明理由这是安全性控制在应用层的延伸。5. 避坑九个实验里最容易翻车的五处这些坑我都见人踩过有些还是反复踩。每一条按现象、原因、解决记写进实验报告的问题与分析栏正合适。5.1 装完连不上用户、端口、监听三处都可能是原因现象执行 gsql 直接报无法连接到服务器或者提示连接被拒绝。原因通常有三类没有切换到数据库安装用户服务进程归属别的账号导致权限不足服务根本没启动只是虚拟机开机了端口不是 26000或者配置文件里改了监听地址导致本地连不上。解决先gs_om -t status看服务状态再确认当前账号是不是安装用户最后显式带上-p 26000连接。三步都过一遍还不行去看数据目录下的日志里面会写清楚拒绝原因。5.2 建表顺序循环外键让第二条 CREATE TABLE 直接失败现象建完教师表接着建院系表时提示引用的表不存在或者反过来。原因教师表记院系编号、院系表记负责人编号两张表互相引用。无论先建哪一张另一张都还不存在。解决先建两张表其中一张的外键留空两张都建好后再用ALTER TABLE ... ADD CONSTRAINT回填外键。外键一定要起名字后面删除和排查都靠这个名字。5.3 标识符大小写加了双引号的名字和没加的不是同一个现象\d能看到表查询时却提示表或列不存在。原因SQL 标准里未加双引号的标识符会被折叠成小写加了双引号则原样保留。用CREATE TABLE Students建出来的表和students是两个不同的对象。解决全套实验统一不加双引号表名列名一律用小写或全大写。已经建了带引号对象的查询时也必须带引号别想着混用。5.4 CHECK 约束放过了空值现象性别字段明明限制了只能是男或女插进去一条空值却成功了。原因CHECK 约束的判定是结果为假才拒绝而空值参与比较得到的是未知既不为真也不为假所以不会被拦住。解决字段上加NOT NULL或者把条件写成CHECK (Sex IN (男,女) AND Sex IS NOT NULL)。演示时先插一条错误数据看报错、再插一条正确数据看成功两张截图一起放说服力最强。5.5 备份恢复了但数据少一截现象用 gs_dump 导出的文件恢复之后最近插入的数据不见了。原因插入数据的那个会话还没 COMMIT数据对其他会话不可见自然也没进备份或者备份和批量写入同时进行恢复出来的是一致性快照中的某个时点。解决备份前确认没有挂着未提交的事务避开批量写入的高峰时段。恢复之后立刻count(*)对比源库行数行数一致才算备份有效。6. 验收与答辩一份能当场演示的检查表实验报告的分数很大一部分不在代码里而在证据链上。九个实验各自的验收物我整理成一张表交之前逐行勾实验该留下的证据常见扣分点一 认识 DBMS服务状态、\l与\du输出只有安装截图没有连接成功二 建库建表建索引建表语句、\d结构、\di索引列表外键未建、索引建了没验证三 交互式 SQL语句本身与结果集同屏只贴结果看不到语句四 创建视图视图定义、查询结果、更新失败示例没说明为什么不可更新五 完整性控制违反约束的报错截图 正确插入只演示成功路径六 安全性控制授权前后对比、新会话验证权限变更后没重连七 事务与并发两个会话的阻塞画面、pg_locks输出单会话演示看不出并发八 备份与恢复备份文件大小、恢复后行数对比只备份不恢复九 JDBC 连接程序运行输出、连接参数、依赖说明缺驱动版本和 classpath 说明演示顺序有个小技巧不要一路顺着演示成功流程那看起来像背稿。先演示一次失败——比如故意插一条违反 CHECK 的数据让它报错再插正确的数据看它成功先在会话 A 里不提交再在会话 B 里展示阻塞。先破后立评委能直接看到你理解约束为什么存在而不只是会敲命令。被追问最多的是三个问题答案要提前准备好为什么这张表用定长字符类型换成变长会怎样为什么在这个字段建索引不建行不行建在别的字段上行不行视图和表到底差在哪为什么查询要绕一层视图。三个问题的共性都是你为什么这样选而不是这个语法怎么写答的时候把取舍讲出来就行。从那以后我每次交实验报告前都强制走一遍最笨的流程把环境清空重装一次从实验一的第一条命令开始重跑能一路跑通才算真做完。跑不通的地方就是报告里最该补的那几段。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/27 20:00:29

VLA技术解析:多模态交互与机器人控制实践

1. VLA语言指令解析概述VLA(Vision-Language-Action)作为当前多模态交互的前沿技术,正在重塑人机交互的范式。我在机器人控制系统的开发实践中发现,传统指令系统存在语义割裂问题——视觉输入、语言理解和动作执行往往采用独立模块…

2026/10/27 19:55:28

AI基准测试争议:Claude 3模型引发的行业反思

1. 事件背景:一条推文引发的AI圈震荡那天早上我刚打开Twitter,就被时间线上密集的AI从业者发言刷屏了。作为长期关注机器学习领域动态的技术博主,我立刻意识到发生了不寻常的事——Anthropic公司官方账号发布的一条推文,正在引发整…

2026/10/27 19:55:28

基于语音识别的阿尔兹海默症早期认知障碍预测:30秒语音分析

简介:基于语音识别的阿尔兹海默症早期认知障碍预测项目包,面向机器学习、深度学习方向的毕业设计、课程设计及期末大作业场景,覆盖从语音数据采集、特征提取到认知障碍风险预测的完整流程,并提供SVM与深度学习两种建模思路。压缩包…

2026/10/28 3:32:49

C++小游戏集合工程化拆解:CMake多目标与终端公共层

简介:这份C小游戏集合面向已掌握基础语法、希望以项目驱动方式巩固编程能力的初学者与爱好者,也适合有经验的开发者用作二次改编的练手素材。包内收录117个文件,以115个cpp源码为主体,另有1个exe可执行文件与1个out输出文件&#…

2026/10/28 3:32:49

AI编程超能力:Superpowers不是功能开关,而是能力基线

1. “Superpowers”不是功能开关,而是AI编程工具链的隐喻性命名体系最近在开发者社区里,“superpowers”这个词频繁出现在各种技术讨论、配置文档甚至错误日志中——但它既不是某个开源项目的正式名称,也不是某款软件的官方功能模块。它实际是…

2026/10/28 3:32:49

WebSocket与Socket.IO技术选型及FastAPI实现对比

1. 项目概述:Web实时通信的技术选型之争第一次在FastAPI中实现实时通信功能时,面对WebSocket和Socket.IO这两个选项,我经历了整整三天的技术选型纠结。这个看似简单的选择背后,实际上涉及到协议特性、浏览器兼容性、消息可靠性等深…

2026/10/28 3:32:49

从零搭建漏洞练习环境:网络靶场隔离、虚拟机与容器实践

很多人第一次接触安全学习,卡住的地方往往不是原理看不懂,而是一堆文章里的截图和自己屏幕上的界面对不上。别人家的"漏洞练习环境"里点两下就能看到某个请求返回了异常结果,你自己的浏览器打开却是一页 404 或者直接连接超时。这种…

2026/10/28 3:32:49

9款论文写作工具实测:专科生如何高效完成毕业论文

1. 论文写作工具测评背景与需求分析每年毕业季,数百万高校学生面临论文写作的"生死劫"。特别是专科层次的毕业生,往往缺乏系统的学术训练,面对开题报告和毕业论文的双重压力时手足无措。我最近实测了市面上9款主打"一键生成&q…

2026/10/28 3:27:49

Claude本地记忆管理方案claude-mem原理与选型指南

1. “claude-mem”不是官方产品,而是开发者社区自发构建的本地记忆增强方案最近在多个技术社区、GitHub Trending 和 Discord 开发者频道里,“claude-mem”这个词频繁出现,搜索量陡增。它既不是 Anthropic 官方发布的 SDK、CLI 工具&#xff…

2026/10/27 14:24:03

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/27 9:34:54

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/28 0:02:13

Python股票自动交易系统源码解析:从行情获取到风控的完整链路

简介:这份资源是面向高校计算机、金融相关专业毕业设计场景的完整项目源码包,主题为基于Python的股票自动交易系统,适合需要完成毕设选题、课程设计或自学金融量化交易开发的学生与开发者参考。压缩包共收录687个文件,整体约14.93…

2026/10/28 0:02:13

视酷酷信IM源码部署指南:Java 17+MySQL 8.0.33实战配置

简介:这是一套2024年亲测可部署的视酷酷信IM即时通讯系统源码,面向具备Java、OC、C#及Vue开发能力的技术人员,解决私有化即时通讯平台快速搭建与二次定制需求,尤其适用于需集成商城、保障数据主权的中小型企业或独立开发者。资源共…

2026/10/28 0:02:13

Python爬取百度迁徙数据:接口解析、批量采集与避坑指南

简介:这份资源是一个用Python爬取百度迁徙数据的脚本压缩包,面向具备Python基础、希望入门网络爬虫与数据解析的开发者,解决按日期获取全国热门城市人口迁徙数据的问题。包内共1个文件,为单个py脚本,压缩包约1KB&#…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑