史上最简单的 MySQL 教程(四十二)「代码执行结构」

温馨提示:本系列博文已经同步到 GitHub,地址为「mysql-tutorial」,欢迎感兴趣的童鞋StarFork,纠错。

代码执行结构

在 MySQL 编程中,代码的执行结构有三种,分别为:

  • 顺序结构;
  • 分支结构;
  • 循环结构。

顺序结构,自不必多说,在本文中,我们着重了解分支结构和循环结构。

分支结构

分支结构:事先准备多个代码块,通过判断条件是否满足,执行对应的代码。

在 MySQL 中,只有if分支结构,其基本语法为:

if 条件判断 then
	-- 满足条件时,要执行的代码
else -- 可以没有 else 语句
	-- 不满足条件时,要执行的代码
end if;

接下来,我们利用触发器和if分支,完成这样的需求:

  • 在生成订单前,判断商品的库存是否满足,如果满足,则插入订单;否则,插入失败。

依次执行如下 SQL 语句,进行测试:

-- 查看商品表
select * from goods;
-- 查看订单表
select * from orders;
-- 修改语句结束符
delimiter $$
-- 创建触发器
create trigger before_order before insert on orders for each row
begin
	-- 判断商品库存是否满足订单
	-- 通过商品表获取商品库存量
	select inventory from goods where id = NEW.goods_id into @inventory;
	-- 比较库存
	if @inventory < NEW.goods_number then
		-- 库存不够,由于触发器不能阻止事件发生,因此我们只能暴力报错
		insert into XXX values(XXX);
	end if;
end
$$
-- 恢复语句结束符
delimiter ;	
01
-- 插入订单
insert into orders values(null, 1, 1000);
-- 查看商品表
select * from goods;
-- 查看订单表
select * from orders;
02
-- 插入订单
insert into orders values(null, 1, 100);
-- 查看商品表
select * from goods;
-- 查看订单表
select * from orders;
03

如上图所示,虽然在报错的时候,没有给出友好的提示信息,但我们已经实现了该需求。

循环结构

循环结构:表示某段代码在指定条件下进行重复执行动作。

在 MySQL 中,没有for循环,仅有while循环、loop循环和repeat循环,呃,还有一种非标准的goto循环,在此我们仅介绍while循环,其基本语法为:

while 条件判断 do
	-- 满足条件时要执行的代码
	-- 变更循环条件
end while;

在使用循环结构的时候,我们经常需要对循环进行控制,即在循环结构内部进行判断和控制。虽然在 MySQL 中没有continuebreak,但是有其替代关键字:

  • iterate:迭代,类似于continue,表示结束本次循环,不执行后续步骤,直接开始下一次循环;
  • leave:离开,类似于break,直接结束整个循环。

上述两个关键字的使用方法为,

  • 基本语法iterate/leave + 循环名称;

因此,在我们定义循环结构的时候,就需要进行略微的修改了,具体形式如下:

循环名称: while 条件判断 do
	-- 满足条件时要执行的代码
	-- 变更循环条件
	iterate/leave 循环名称; -- 控制循环语句
end while;

由于触发器只能执行简单的一次触发动作,因此不适合演示循环结构。循环结构需要结合函数进行使用,所以在介绍函数的时候,我们再来体验循环结构的魅力。


温馨提示:符号[]括起来的内容,表示可选项;符号+,则表示连接的意思。


———— ☆☆☆ —— 返回 -> 史上最简单的 MySQL 教程 <- 目录 —— ☆☆☆ ————

原创声明,本文系作者授权云+社区-专栏发表,未经许可,不得转载。

如有侵权,请联系 zhuanlan_guanli@qq.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot 核心技术

欢迎使用开源的代码生成器Code-Builder

本来code-builder是专门为MyBatis Enhance来编写的一块代码生成器,不过仅仅使用到Enhance却没有什么新鲜感,所以把生成这块分离出来提...

531
来自专栏C/C++基础

Google C++编程风格指南(一)之头文件的相关规范

一个良好的编程规范和风格是一名程序猿成熟的标志。规范的编码可以减少代码冗余,降低出错概率,便于代码管理和代码交流等等,事实上,其作用远不止这些,我们要牢记编码规...

911
来自专栏北京马哥教育

Ansible 详细用法说明(二)

例:获取某台主机的变量 ansible 10.1.6.68 -m setup ===================================== sc...

2815
来自专栏友弟技术工作室

Beego Models之四模型定义

使用orm定义,然后使用cmd方式,自动建表,不过在实际生产中还是直接使用sql操作的,这种模型定义在生产环境中定义的比较少,基本上都是直接使用基本类型,一些特...

752
来自专栏技术小黑屋

效率工具:强大的批量删除文件的脚本

最近打包服务器上的apk包又增多了,每次手动rm操作过于麻烦,于是花了几分钟写了一个可以对指定目录下根据最后修改时间和通配符匹配进行批量删除的脚本。将这个脚本加...

502
来自专栏Python小屋

Python批量提取Word文件题库中的答案

问题描述:假设有Word文件“Python题库.docx”中有若干Python题目(目前有1000道,已在公众号内分享第一期1000道Python题库系列分享一...

2483
来自专栏极客编程

linux下的shell脚本编程

Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既是一种命令语言,又是一种程...

642
来自专栏一“技”之长

Xcode中修改变量名、类名及字符串的替换操作

        在做iOS开发代码优化的工作时,优化代码结构之前,我们应该先整理好工程的外貌,将文件和类的命名进行规范,在Xcode中为我们提供了方便而强大的名...

572
来自专栏C++

python笔记:#014#综合应用

1347
来自专栏林冠宏的技术文章

全面总结: Golang 调用 C/C++,例子式教程

作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:htt...

4085

扫描关注云+社区