当前位置: 首页 > news >正文

数据库实战:从零掌握DML核心操作(增删改查全解析)

1. 初识DML:数据库的"编辑工具箱"

想象你面前有一本厚厚的花名册,需要不断记录新同学信息、更新学生成绩、修正错误条目。在数据库世界里,这套操作就叫DML(Data Manipulation Language)。它不像创建表结构的DDL那么严肃,更像是日常使用的"编辑三件套":INSERT像钢笔(新增记录)、UPDATE像涂改液(修改数据)、DELETE像碎纸机(删除数据)。我在管理学生信息系统时,90%的日常工作都靠这三个操作完成。

先看个典型的学生表结构:

CREATE TABLE students ( student_id VARCHAR(10) PRIMARY KEY, name VARCHAR(20) NOT NULL, department VARCHAR(30), class VARCHAR(10), gender CHAR(1), birthday DATE, credits INT DEFAULT 0 );

这个表就像我们的"数字花名册",接下来所有操作都围绕它展开。新手常犯的错误是直接上手写SQL,其实应该先搞清楚三个关键问题:

  1. 操作对象是谁:这里是students表
  2. 要影响哪些字段:比如只更新学分还是修改多项信息
  3. 条件范围是什么:修改单条记录还是批量处理

2. 新增数据:INSERT的三种实用姿势

2.1 标准插入:新生入学登记

每学期迎新时,最常用的就是完整插入:

-- 插入马明的完整信息 INSERT INTO students VALUES ('2023001', '马明', '计算机系', 'CS-101', 'M', '2000-05-12', 32);

这里有个坑要注意:字段顺序必须严格匹配表结构定义。我有次把生日和学分顺序写反,导致系统记录了个"出生在32年的学生",闹了大笑话。更安全的写法是显式指定字段:

INSERT INTO students (student_id, name, department, class, gender, birthday, credits) VALUES ('2023002', '李红', '外语系', 'FL-201', 'F', '2001-03-08', 28);

2.2 缺省插入:信息不全时的处理

有时新生材料不全,比如转学生学分尚未核定:

-- 只插入已知信息,学分使用默认值0 INSERT INTO students (student_id, name, department, gender) VALUES ('2023003', '张伟', '物理系', 'M');

这时要注意:

  • 非空字段(如name)必须包含
  • 未指定的字段要么允许NULL,要么有默认值
  • 主键(student_id)绝对不能遗漏

2.3 批量导入:迎新季的高效操作

开学时要处理上百条记录,逐条INSERT会疯掉。我常用的两种批量方法:

方法一:VALUES列表

INSERT INTO students VALUES ('2023004', '王芳', '数学系', 'MA-102', 'F', '2000-11-21', 30), ('2023005', '赵强', '化学系', 'CH-101', 'M', '1999-09-03', 34), ('2023006', '刘洋', '生物系', 'BIO-201', 'M', '2000-07-14', 28);

方法二:SELECT导入

-- 从临时表导入数据 INSERT INTO students SELECT * FROM new_students_temp WHERE status = 'verified';

批量操作时要注意事务处理,建议加上:

BEGIN TRANSACTION; -- 批量操作... COMMIT; -- 出错时执行ROLLBACK

3. 修改数据:UPDATE的精准手术刀

3.1 单记录修改:学生信息修正

发现马明的班级录入错误:

UPDATE students SET class = 'CS-102' WHERE student_id = '2023001';

这里有个血泪教训:忘记WHERE条件会全表更新!有次我误操作导致全校学生都被改成计算机系,幸好有备份。建议先写WHERE条件再写SET部分。

3.2 批量更新:学分调整实战

期末时给计算机系学生统一加2学分:

UPDATE students SET credits = credits + 2 WHERE department = '计算机系';

处理NULL值要特别小心:

-- 先处理NULL值再计算(MySQL写法) UPDATE students SET credits = IFNULL(credits, 0) + 2 WHERE department = '数学系';

3.3 多字段更新:学生转系处理

张伟从物理系转到电子工程系,同时班级变更:

UPDATE students SET department = '电子工程系', class = 'EE-301', credits = credits - 5 -- 转系扣除5学分 WHERE student_id = '2023003';

4. 删除数据:DELETE的安全操作指南

4.1 精准删除:学生退学处理

学号2023006的学生退学:

DELETE FROM students WHERE student_id = '2023006';

重要原则:

  1. 删除前先用SELECT确认范围
  2. 重要数据先备份再删除
  3. 考虑使用软删除(添加is_deleted字段)

4.2 条件删除:批量清理数据

删除所有已毕业学生(假设毕业年份为2023):

-- 先创建备份 CREATE TABLE graduated_students_2023 AS SELECT * FROM students WHERE class LIKE '%-23'; -- 再执行删除 DELETE FROM students WHERE class LIKE '%-23';

4.3 全表删除:谨慎使用的核按钮

清空临时测试表:

-- 危险操作!清空整个表 TRUNCATE TABLE test_students;

TRUNCATE与DELETE的区别:

  • TRUNCATE不可回滚
  • TRUNCATE重置自增ID
  • TRUNCATE不触发DELETE触发器

5. 实战技巧:避坑经验分享

事务处理是生命线

BEGIN; UPDATE accounts SET balance = balance - 100 WHERE user_id = 'U1001'; UPDATE students SET status = 'paid' WHERE student_id = '2023001'; COMMIT; -- 任一语句失败都会自动回滚

性能优化小技巧

  1. 大批量INSERT时关闭索引
  2. UPDATE前先EXPLAIN查看执行计划
  3. 定期用ANALYZE TABLE更新统计信息

安全备份策略

-- 创建表结构副本 CREATE TABLE students_backup LIKE students; -- 复制数据 INSERT INTO students_backup SELECT * FROM students; -- 或使用导出命令 mysqldump -u root -p school students > students_backup.sql

有次系统故障,我就是靠每小时一次的增量备份恢复了关键数据。现在我的工作准则就是:修改前先备份,删除前双确认

http://www.jsqmd.com/news/558026/

相关文章:

  • 终极指南:FXBlurView调试技巧与模糊效果异常快速定位
  • KOReader内存碎片优化终极指南:如何让电子书阅读器长期稳定运行
  • 谷粒商城课程设计
  • 5分钟快速上手:Rufus免费工具制作Windows启动盘终极指南
  • 颠覆认知的5个Stagehand实战技巧:突破AI网页自动化瓶颈的进阶策略
  • ZERO-IG:零样本学习驱动的低光图像联合去噪与自适应增强技术解析
  • AT32F403A开发板8个串口全开实战:用V2库实现多路数据同时收发(附完整代码)
  • 突破性能瓶颈:VirtualAPK插件框架下的Jetpack Compose优化实践
  • 顶刊IEEE TPE论文算法复现:永磁同步电机转速调节的抗干扰滑模控制器代码
  • Janus-Pro-7B保姆级教程:app.py源码关键函数注释与API接口扩展指引
  • Unity游戏高效转微信小游戏的实战技巧与资源优化策略
  • Ubuntu 20.04 下 PCL 1.8 从源码编译到可视化测试全流程
  • PyTorch张量操作实战:从基础运算到高效数据处理
  • OpenClaw性能调优:nanobot镜像的vllm参数详解
  • 模型微调数据准备:用OpenClaw自动标注百川2-13B-4bits的训练样本
  • OpenClaw配置详解:GLM-4.7-Flash模型参数调优手册
  • 密封类进化论:Java 25新增sealed enum、sealed record及跨模块permits声明(仅限Early-Access Build 25+)
  • USRP B210固件版本冲突?老司机教你如何降级FPGA固件搞定GNU Radio
  • 基于ENSP的智慧校园网络架构设计与实战部署
  • 终极指南:LitmusChaos从混沌测试到智能韧性工程的完整演进路径
  • Mamba YOLO实战解析:如何用状态空间模型重塑实时目标检测
  • Spark企业级应用案例:电商平台用户行为分析系统
  • 终极指南:protobuf-net性能基准测试与主流序列化器的全面对比
  • 超简单!UltraViewPager集成指南:Gradle与Maven依赖配置详解
  • z.lua 向后跳转技巧:告别重复输入 cd ../../..
  • 3分钟掌握医学文献关键信息:本草模型如何从肝癌研究中提取核心知识
  • IEC61850协议解析:从信息模型到智能变电站的通信架构
  • CSS媒体查询响应式设计终极指南:CSS Reference多设备适配完全教程
  • 终极Mac命令行工具:开发者必备的macOS效率神器
  • 工控C#上位机之Chart控件:打造可视化界面的利器