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

06 mysql之DML

一、什么是DML

DML 用于操作数据库中的数据。主要命令包括:

  • INSERT:添加数据
  • SELECT:查询数据
  • UPDATE:修改数据
  • DELETE:删除数据

二、插入数据(INSERT)

2.1 插入单条记录

-- 插入学生记录(使用默认值)
INSERT INTO students (student_id, student_name, age, gender, birth)
VALUES (1,'张三', 18, 'M', '1996-7-22');-- 插入教师记录(关联学生ID=1)
INSERT INTO teachers (teacher_id, teacher_name, subject, experience_years, mentor_student_id)
VALUES (1, '李四', '数学', 5, 1);

2.2 批量插入

INSERT INTO students (student_id, student_name, age, gender, birth)
VALUES 
(2, '王丽', 17, 'F', '1996-3-2'),
(3, '张起灵', 19, 'M', '1997-11-9');

数据库数据最后如下:

三、修改数据(UPDATE)

-- 修改单个记录
UPDATE students
SET age = 20, email = 'zhangsan_new@school.com'
WHERE student_id = 1;-- 批量修改
UPDATE teachers
SET experience_years = experience_years + 1
WHERE subject = '数学';

四、删除数据(DELETE) 

-- 删除单条记录
DELETE FROM students WHERE student_id = 3;-- 删除所有记录(保留表结构)
DELETE FROM teachers;

五、事务处理(ROLLBACK;)

回滚(Rollback)的作用是撤销还未提交的事务。MySQL中可以使用以下语句实现回滚:ROLLBACK;

确保一组操作的原子性(全部成功或全部失败):

DELIMITER //CREATE PROCEDURE process_student_teacher()
BEGIN-- 声明错误处理DECLARE EXIT HANDLER FOR SQLEXCEPTIONBEGINROLLBACK;  -- 出错时回滚RESIGNAL;  -- 重新抛出错误END;-- 开始事务START TRANSACTION;-- 执行 SQL 操作INSERT INTO students (name, age) VALUES ('测试', 20);UPDATE teachers SET experience_years = 10 WHERE teacher_id = 1;-- 成功则提交COMMIT;
END //DELIMITER ;-- 调用存储过程
CALL process_student_teacher();

因为没有name这个字段,会回滚

  • DELIMITER //:由于存储过程包含多个 SQL 语句(用 ; 分隔),而 MySQL 默认用 ; 作为语句结束符,所以临时改成 // 避免冲突。

  • CREATE PROCEDURE:定义一个存储过程,名为 process_student_teacher

  • BEGIN ... END:存储过程的主体部分,包含要执行的 SQL 逻辑。

  • DECLARE EXIT HANDLER FOR SQLEXCEPTION

    • 声明一个 错误处理器(Error Handler),当发生 SQLEXCEPTION(SQL 错误)时触发。

    • EXIT 表示执行完错误处理后,退出存储过程(也可以使用 CONTINUE 继续执行)。

  • ROLLBACK

    • 如果发生错误(如插入失败、更新失败),回滚整个事务,撤销所有更改。

  • RESIGNAL(可选):

    • 重新抛出错误,让调用者(如应用程序)知道发生了什么问题。如果省略,错误会被静默处理。

  • START TRANSACTION

    • 开启一个事务,后续的 SQL 操作要么全部成功,要么全部失败(原子性)。

  • INSERT / UPDATE

    • 在事务内执行 SQL 操作,如果任何一步失败,整个事务会回滚。

  • COMMIT

    • 如果所有操作成功,提交事务,使更改永久生效。

  • CALL 用于执行存储过程,相当于调用一个封装好的 SQL 逻辑块。

相关文章:

  • R-tree详解
  • 2025年第十六届蓝桥杯大赛软件赛C/C++大学B组题解
  • C++设计模式——单例模式
  • SpringBoot 3.X 开发自己的 Spring Boot Starter 和 SpringBoot 2.x 的区别
  • Python查询ES错误ApiError(406, ‘Content-Type ...is not supported
  • 【传感器多模态融合与AI驱动】
  • Leetcode 3548. Equal Sum Grid Partition II
  • 常见网卡接口命名方式
  • OpenAI for Countries:全球AI基础设施的“技术基建革命”
  • 苍穹外卖--新增菜品
  • 新华三H3CNE网络工程师认证—路由参数与比较
  • Gartner《如何有效融合Data Fabric 与Data Mesh数据战略》学习心得
  • DeepBook 与 CEX 的不同
  • github 上的 CI/CD 的尝试
  • 【言语】刷题3
  • visual studio生成动态库DLL
  • 【MySQL】MySQL数据库结构与操作
  • QT 插槽实现
  • WebpackVite总结篇与进阶
  • Kotlin 中的 Unit 类型的作用以及 Java 中 Void 的区别
  • 国内首家破产的5A景区游客爆满,洛阳龙潭大峡谷:破产并非因景观不好
  • 北斗专访|特赞科技范凌:现在AI主要是“说话”,接下来要“干活”了
  • 西北大学副校长范代娣成陕西首富?系家庭财富,本人已从上市公司退出
  • 法治日报:炮制师生日常剧本,校园怎么成了短视频流量秀场?
  • 习近平结束对俄罗斯国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典回到北京
  • 新城市志|上海再攻坚,营商环境没有最好只有更好