參考:http://blog.csdn.net/qq_35246620/article/details/70823903
代碼執行結構
在 MySQL 編程中,代碼的執行結構有三種,分別爲:
- 順序結構;
- 分支結構;
- 循環結構。
順序結構,自不必多說,在本文中,我們着重瞭解分支結構和循環結構。
分支結構
分支結構:事先準備多個代碼塊,通過判斷條件是否滿足,執行對應的代碼。
在 MySQL 中,只有if
分支結構,其基本語法爲:
if 條件判斷 then
-- 滿足條件時,要執行的代碼
else -- 可以沒有 else 語句
-- 不滿足條件時,要執行的代碼
end if;
- 1
- 2
- 3
- 4
- 5
接下來,我們利用觸發器和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 ;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
-- 插入訂單
insert into orders values(null, 1, 1000);
-- 查看商品表
select * from goods;
-- 查看訂單表
select * from orders;
- 1
- 2
- 3
- 4
- 5
- 6
-- 插入訂單
insert into orders values(null, 1, 100);
-- 查看商品表
select * from goods;
-- 查看訂單表
select * from orders;
- 1
- 2
- 3
- 4
- 5
- 6
如上圖所示,雖然在報錯的時候,沒有給出友好的提示信息,但我們已經實現了該需求。
循環結構
循環結構:表示某段代碼在指定條件下進行重複執行動作。
在 MySQL 中,沒有for
循環,僅有while
循環、loop
循環和repeat
循環,呃,還有一種非標準的goto
循環,在此我們僅介紹while
循環,其基本語法爲:
while 條件判斷 do
-- 滿足條件時要執行的代碼
-- 變更循環條件
end while;
- 1
- 2
- 3
- 4
在使用循環結構的時候,我們經常需要對循環進行控制,即在循環結構內部進行判斷和控制。雖然在 MySQL 中沒有continue
和break
,但是有其替代關鍵字:
iterate
:迭代,類似於continue
,表示結束本次循環,不執行後續步驟,直接開始下一次循環;leave
:離開,類似於break
,直接結束整個循環。
上述兩個關鍵字的使用方法爲,
- 基本語法:
iterate/leave + 循環名稱;
因此,在我們定義循環結構的時候,就需要進行略微的修改了,具體形式如下:
循環名稱: while 條件判斷 do
-- 滿足條件時要執行的代碼
-- 變更循環條件
iterate/leave 循環名稱; -- 控制循環語句
end while;
- 1
- 2
- 3
- 4
- 5
由於觸發器只能執行簡單的一次觸發動作,因此不適合演示循環結構。循環結構需要結合函數
進行使用,所以在介紹函數的時候,我們再來體驗循環結構的魅力。