觸發器和事務處理

前言

表的增刪改查:

1️⃣ :mysql環境準備

2️⃣ :簡單的表查詢

3️⃣ :通配符+正則表達式

4️⃣ :mysql函數與分組

5️⃣ :子查詢_聯結查詢_組合查詢

6️⃣ :mysql全文本搜索

7️⃣ :表的增刪改查

一個一個小模塊:

8️⃣ :視圖+存儲過程+遊標的簡單使用

第一部分:我們準備環境:安裝數據庫+創建數據庫+創建用戶+授權。

第二部分:環境準備好後,進行簡單的單表查詢:導入表+表查詢。

第三部分:通配符和正則表達式,增強where的篩選功能。

第四部分:對列進行計算處理稱爲字段。複雜的字段用函數處理。按照不同組彙總,進行分組操作。

第五部分:在多表上進行查詢:子查詢+聯結查詢+組合查詢。

第六部分:mysql的全文本搜索。

第七部分:表的刪改查。

前七部分組成表的增刪改查。 之後都是一個一個小模塊的介紹。

第八部分:視圖是虛擬的表;存儲過程是一條或多條MySQL語句的集合;對於填有數據的遊標,根據需要取出(檢索)各行;

現在是第九部分:參考《mysql必知必會》chapter 25~26,觸發器+事務處理


摘要與總結

想要某條語句(或某些語句)在事件發生時自動執行 —> 產生了觸發器

保證成批的MySQL操作要麼完全執行,要麼完全不執行 —> 數據庫的事務處理



觸發器

推薦:MySQL觸發器trigger的使用

Q:爲什麼需要觸發器

想要某條語句(或某些語句)在事件發生時自動執行。

eg:每當訂購一個產品時,都從庫存數量中減去訂購的數量。

Q:定義下觸發器,定不定義就那樣吧

在某個表發生更改時自動處理。這確切地說就是觸發器。

觸發器是MySQL響應INSERT、DELETE、UPDATE而自動執行的一條MySQL語句。

所以,我們也可以將觸發器分下類:INSERT型觸發器、DELETE型觸發器、UPDATE型觸發器

在具體使用觸發器的時候,還得補充兩個表:NEW表、OLD表

  • 在INSERT型觸發器中,NEW用來表示將要(BEFORE)或已經(AFTER)插入的新數據;
  • 在DELETE型觸發器中,OLD用來表示將要或已經被刪除的原數據;
  • 在UPDATE型觸發器中,OLD用來表示將要或已經被修改的原數據,NEW用來表示將要或已經修改爲的新數據;
  • OLD是隻讀的,而NEW則可以在觸發器中使用 SET 賦值,這樣不會再次觸發觸發器,造成循環調用
-- 觸發器

-- insert觸發器
create trigger insert_trigger
after insert on orders
for each row
select new.order_date into @tmp;

-- 驗證insert觸發器
insert into orders(order_date,cust_id) values(now(),10001);
select @tmp;

-- 查看觸發器
show triggers;

-- 刪除Insert觸發器
drop trigger insert_trigger;

-- -----------------------------------------

-- delete 觸發器
-- 準備工作創建一個表
create table order_delete_items(order_num int,order_date datetime,cust_id int);
delimiter $$
create trigger delete_trigger before delete on orders
for each row
begin
	insert into order_delete_items(order_num,order_date,cust_id)
    values(old.order_num,old.order_date,old.cust_id);
end$$
delimiter ;

-- 驗證刪除觸發器
-- 由於主鍵外鍵的約束
show variables like 'sql_safe%';
set sql_safe_updates=0;
-- select order_num from orders where cust_id=10003;
delete from orderitems
	where order_num in(select order_num from orders where cust_id=10003); 
delete from orders where cust_id=10003;
set sql_safe_updates=1;

-- 刪除觸發器
drop trigger delete_trigger;

-- ---------------------------------------------
-- update觸發器
create trigger update_trigger after update on orders
for each row select 'update successfully' into @tmp;

-- 測試update觸發器
update orders
set order_date=now()
where order_num=20005;

select @tmp;


管理事務處理

Q:事務的來由

有些事情雖然分爲幾步,但是要麼做,要麼不做,不能做一半停下了。

這樣才能保證數據庫中數據的一致性。

關於事務處理需要知道的幾個術語

  • 事務(transaction)指一組SQL語句;

  • 回退(rollback)指撤銷指定SQL語句的過程;

  • 提交(commit)指將未存儲的SQL語句結果寫入數據庫表;

  • 保留點( savepoint)指事務處理中設置的臨時佔位符( placeholder),你可以對它發佈回退(與回退整個事務處理不同)。

-- 簡單的寫一個沒啥意義的事務處理

select * from customers where cust_id=10001;

set autocommit=0;   -- 禁止默認提交
start transaction;  -- 標識事務的開始
savepoint update1;  -- 使用保留點
update customers 
set cust_name='dacao'
where cust_id='10001';

select * from customers where cust_id=10001;

rollback to update1; -- 使用保留點
commit;           -- 提交,這裏提交了個毛線
set autocommit=1; -- 啓用默認提交

select * from customers where cust_id=10001;


參考文章

MySQL觸發器trigger的使用

『淺入深出』MySQL 中事務的實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章