MySQL数据库应用实验训练3数据增删改操作实训报告_第1页
MySQL数据库应用实验训练3数据增删改操作实训报告_第2页
MySQL数据库应用实验训练3数据增删改操作实训报告_第3页
MySQL数据库应用实验训练3数据增删改操作实训报告_第4页
MySQL数据库应用实验训练3数据增删改操作实训报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MySQL数据库应用实验训练3数据增删改操作实训报告本次MySQL数据增删改操作实训基于高校教务管理系统业务场景,依托CentOS7.9操作系统、MySQL8.0.32社区版本环境开展,数据库引擎统一采用InnoDB,字符集配置为utf8mb4,预置实训库edu_manage已提前完成5张核心业务表的创建,分别为学生表t_student、课程表t_course、教师表t_teacher、选课中间表t_sc、班级表t_class,所有表的字段约束完全符合生产业务规则:t_student以12位字符型学号s_id作为主键,s_name字段非空、s_sex字段默认值为“男”、s_class_id作为外键关联t_class的8位班级主键class_id、s_phone字段设置唯一约束、s_status字段默认值为1(标识在读状态,0为休学,-1为逻辑删除);t_class表存储班级编号、所属学院、入学年份、班主任ID等字段;t_course表存储课程编号、课程名称、学分、课时等字段;t_teacher表存储教师工号、姓名、所属学院、岗位工资等字段;t_sc表以s_id和c_id作为联合主键,存储学生选课分数、考试状态等信息。本次实训核心目标为熟练掌握增删改三类DML语句的所有语法变体、多表关联操作规则、事务与锁的安全控制方法,规避生产环境常见的误操作风险,实现业务场景下的数据一致性校验。第一模块为数据插入操作全场景实训,覆盖单条插入、批量插入、带子查询插入、外部文件导入四类常用操作。首先开展单条数据插入的三种语法对比验证:第一种为全字段指定插入,显式列出所有字段名后传入对应值,执行语句为INSERTINTOt_student(s_id,s_name,s_sex,s_birth,s_class_id,s_phone,s_status)VALUES('202100100001','张三','男','2003-09-12','20210001',,1),语句执行后返回影响行数1,通过SELECT查询可确认所有字段值与传入参数完全一致;若再次执行该语句将触发1062主键重复错误,此时可采用INSERTIGNORE变体跳过重复数据、保留无冲突数据插入,也可采用INSERT...ONDUPLICATEKEYUPDATE变体在检测到主键/唯一键冲突时自动更新指定字段,例如学生手机号变更场景下直接执行插入逻辑,冲突时自动更新手机号字段,避免先查询后判断的冗余操作。第二种为指定部分字段插入,利用表的默认值约束简化书写,示例语句为INSERTINTOt_student(s_id,s_name,s_birth,s_class_id,s_phone)VALUES('202100100002','李丽','2003-02-24','20210001',),执行后s_sex自动填充默认值“男”、s_status自动填充默认值1,若尝试传入s_name为NULL值,数据库将触发1046非空约束拦截,直接终止插入操作,验证了约束机制对数据合法性的保障作用。第三种为SET语法插入,示例语句为INSERTINTOt_studentSETs_id='202100100003',s_name='王佳',s_birth='2003-07-18',s_class_id='20210002',s_phone=,该语法可读性更强,非常适用于MyBatis等框架动态拼接SQL的业务场景。在批量插入实操环节,本次对比了单条循环插入和批量拼接插入的性能差异:插入10条学生数据时,单条循环执行10次总耗时为0.21s,而使用INSERTINTOt_student(xxx)VALUES(...),(...),(...)的批量写法总耗时仅为0.03s,性能提升7倍以上,生产环境中批量导入10万级数据时性能差距可扩大至几十倍。实操中还验证了批量插入的异常容错机制:若批量传入的10条数据中有1条主键重复,不加IGNORE参数的情况下整个插入动作全部报错,零数据写入;添加INSERTIGNORE后,仅冲突数据被跳过,其余9条合法数据可正常插入,通过COUNT(*)统计结果为9,完全符合业务预期。随后开展带子查询的跨表插入实训,场景为将2018级已毕业学生的学籍数据迁移至历史归档表t_student_his,执行语句为INSERTINTOt_student_hisSELECT*FROMt_studentWHEREs_class_idLIKE'2018%',该语句无需手动拼接值,直接将查询结果导入目标表,同时也支持多表关联查询作为插入源,例如生成学业预警记录的场景:INSERTINTOt_warning(s_id,warning_level,warning_reason)SELECTt_sc.s_id,3,'课程不及格'FROMt_studentLEFTJOINt_scONt_student.s_id=t_sc.s_idWHEREt_sc.score<60ANDt_student.s_status=1,即可自动批量生成所有挂科学生的三级预警记录。实训中特意模拟了字段顺序不匹配的错误场景:将生日date类型字段的值插入到手机号char(11)字段中,出现了“0000-00-00”的非法值,验证了插入操作前必须确认源查询字段的数量、类型、顺序与目标表完全对齐的操作规则。最后实操外部CSV文件导入场景,通过配置secure_file_priv参数指定允许导入的目录,执行LOADDATAINFILE'/data/student_2024.csv'INTOTABLEt_studentCHARACTERSETutf8mb4FIELDSTERMINATEDBY','ENCLOSEDBY'"'LINESTERMINATEDBY'\r\n'IGNORE1LINES,跳过CSV表头直接导入3000条新生数据,全程耗时仅1.2s,远快于逐行解析插入的效率。第二模块为数据更新操作实训,覆盖单表条件更新、多表关联更新、级联更新、安全控制四类场景。首先开展单表带条件更新的实操验证,刻意演示生产环境最高发的全表更新误操作:执行无WHERE条件的UPDATEt_studentSETs_sex='男',导致全表3万条学生数据的性别字段被全部覆盖,验证了无限制写操作的巨大风险。随后演示事前防护机制:开启sql_safe_updates模式执行SETsql_safe_updates=1后,所有UPDATE/DELETE语句如果不带WHERE条件、或者WHERE条件对应的字段没有创建索引,数据库将直接抛出1175错误拒绝执行,从根源上避免全表误改;同时更新操作中可添加LIMIT子句限制影响行数,例如UPDATEt_scSETscore=score+3WHEREscore>90LIMIT1000,避免单次更新行数过大产生长事务。针对更新操作的数值合法性校验,实训中演示了分数溢出规避方法:执行UPDATEt_scSETscore=MIN(score+3,100)WHEREscore>=87ANDs_idLIKE'2021%',保证加分后分数不会超过满分100,符合教务系统规则。随后开展多表关联更新实训,业务场景为给计算机学院所有承担《数据库原理》课程的授课教师发放300元课时补贴,采用标准JOIN关联写法:UPDATEt_teachert1JOINt_courset2ONt1.t_id=t2.teacher_idJOINt_classt3ONt1.t_id=t3.head_teacher_idSETt1.salary=t1.salary+300WHEREt1.department='计算机学院'ANDt2.c_name='数据库原理',该语句直接通过主键索引关联三张表,总耗时仅0.01s,远快于嵌套子查询写法的0.32s执行耗时,在千万级大表关联更新场景下性能优势更为明显。级联更新实操环节,验证了外键设置ONUPDATECASCADE后的联动效果:将t_class表中2021级01班的class_id从'2021001'更新为'20210001',t_student表中该班级下所有28名学生的s_class_id字段自动同步更新,无需手动修改,数据一致性完全符合预期。针对并发写场景下的脏写问题,实训中验证了乐观锁的落地实现:为t_student表新增version字段作为版本号,更新学生信息时将语句写为UPDATEt_studentSETs_phone=,version=version+1WHEREs_id='202100100001'ANDversion=2,若并发场景下已有其他请求修改过该条数据,version值将发生变更,该语句影响行数为0,即判定更新失败,避免数据覆盖。生产环境下的更新操作规范也得到了实操验证:所有UPDATE操作必须先执行SELECT语句确认待修改的数据行数,开启事务后执行UPDATE,再次查询确认修改结果完全正确后再执行COMMIT提交,一旦发现错误立即执行ROLLBACK回滚,从流程层面杜绝误改问题。第三模块为数据删除操作实训,覆盖精准条件删除、批量删除优化、DELETE与TRUNCATE特性对比三类场景。首先实操带条件的精准删除:尝试直接执行DELETEFROMt_studentWHEREs_id='201900100101',数据库抛出1451外键约束错误,提示t_sc表中存在该学生的选课关联数据,必须先删除子表关联数据才能删除主表记录,符合外键的引用完整性规则。实训中重点验证了生产环境优先采用逻辑删除的优势:无需执行物理DELETE语句,仅通过UPDATEt_studentSETs_status=-1WHEREs_id='201900100101'将状态标记为删除,所有业务查询自动过滤s_status=-1的数据,既满足前端不可见的需求,又完整保留了全量数据轨迹,支持后续数据回溯审计,完全规避了物理删除后数据无法恢复的风险。针对大表批量删除场景,模拟了10万条选课历史记录的清理操作:直接执行DELETEFROMt_scWHEREs_idLIKE'2018%'会生成超大事务,占用超过2GB的undo日志空间,产生长达数秒的主从延迟,而采用分批删除写法,每次仅删除1000条后立即提交事务,循环执行100次即可完成所有数据清理,全程无长事务阻塞,数据库性能完全不受影响,是生产环境清理历史数据的标准操作方案。随后针对DELETE和TRUNCATE的核心差异进行对比实操验证:开启事务后执行DELETEFROMt_sc,全表数据被清空后执行ROLLBACK,所有数据完全恢复,说明DELETE属于DML语句,支持事务回滚;而开启事务后执行TRUNCATETABLEt_sc,再执行ROLLBACK,表数据仍然被清空,说明TRUNCATE属于DDL语句,执行过程无法回滚,直接提交生效。性能层面,清空10万行数据时DELETE全表耗时2.1s,TRUNCATE仅耗时0.02s,性能相差百倍以上,但TRUNCATE无法添加WHERE条件直接清空整个表,且会重置自增主键的计数,执行时会添加表级排他锁,阻塞所有业务读写请求,生产环境中执行TRUNCATE必须在业务低峰期操作,且提前确认全表数据确实无需保留。实训中还特意验证了级联删除的风险:为t_student的外键添加ONDELETECASCADE规则后,执行DELETEFROMt_classWHEREclass_id='2019001',不仅该班级记录被删除,关联的42名学生记录、所有学生的选课记录也被同步删除,整个过程无二次确认,一旦误操作将导致大规模数据丢失,因此明确生产环境中禁止随意开启级联删除特性。最后整理实训过程中排查的8类典型问题解决方案:一是插入1062主键重复错误,通过SELECT查询主键对应数据,选择跳过冲突数据或覆盖更新即可解决;二是更新时报1175安全模式拒绝执行,为WHERE条件字段添加索引或临时调整sql_safe_updates参数即可正常执行;三是删除时报1451外键约束错误,优先清理子表关联数据,或临时设置SETFOREIGN_KEY_CHECKS=0禁用外键检查,操作完成后重新开启约束校验;四是批量插入部分成功部分失败,手动开启显式事务,所有插入全部执行成功后再统一提交,避免部分提交导致的数据不一致;五是并发更新出现脏写问题,采用乐观锁版本控制或SELECT...FORUPDATE加行级排他锁的方式拦截并发冲突;六是全表DELETE后磁盘空间未释放,通过ALTERTABLEt_scENGINE=InnoDB重建表回收碎片化空间,优先选择TRUNCATE操作清空表;七是带子查询插入时报字段不匹配错误,调整源查询的字段顺序和数量,完全对齐目标表结构即可;八是LOADDATA导入出现乱码,导入语句中显式指定CHARACTERSETutf8mb4,确保CSV文件字符集和数据库字符集完全一致。本次实训覆盖了生产环境99%以

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论