mysql多字段修改update_MySQL ------ 触发器(TRIGGER)(二十七)
MySQL 語句在需要時被執(zhí)行,存儲過程也是,但是你要是想要某條(或某些語句)在事件發(fā)生時自動執(zhí)行,該怎么辦觸發(fā)器由此而來
觸發(fā)器:某個表發(fā)生更改時自動處理。觸發(fā)器是MySQL響應(yīng)delete,insert,update(增加,刪除,修改)時,自動執(zhí)行的一條MySQL語句,或位于begin和end語句之間的一組語句,
ALTER:觸發(fā)器將在(delete,insert,update) 語句成功后執(zhí)行,
BEFORE:觸發(fā)器將在(delete,insert,update) 語句前執(zhí)行。
版本:于MySQL5 中增加,適用于MySQL5或之后的版本
如以下情景:1、每當(dāng)增加一個顧客到某個數(shù)據(jù)庫表時,都檢查其電話號碼格式是否正確,州的縮寫是否為大寫 2、每當(dāng)訂購一個產(chǎn)品時,都從庫存數(shù)量中減去訂購數(shù)量 3、無論何時刪除一行,都在某個存檔表中保留一個副本創(chuàng)建觸發(fā)器的主要步驟、
1、唯一的觸發(fā)器名
2、觸發(fā)器關(guān)聯(lián)的表
3、觸發(fā)器應(yīng)該響應(yīng)的活動(delete,insert,update)
4、觸發(fā)器何時執(zhí)行(處理之前或之后)
注意:在mysql 5中觸發(fā)器名必須在每個表中唯一,但不是在每個數(shù)據(jù)庫中唯一,雖然允許在同一個庫中的兩個表,有相同名字的觸發(fā)器,但是最好在數(shù)據(jù)庫范圍內(nèi)使用唯一的觸發(fā)器名。
-- create trigger 觸發(fā)器名1111
CREATE TRIGGER 用來創(chuàng)建名為 tri_vendors 的新觸發(fā)器。觸發(fā)器可在一個操作發(fā)生前或之后執(zhí)行,這里給出了ALTER INSERT,所以此觸發(fā)器將在INSERT 語句成功后執(zhí)行。這個觸發(fā)器還指定FOR EACH ROW,因此代碼對每個插入行執(zhí)行,文本 add a vendor 將對每個插入的行顯示一次。
為了測試這個觸發(fā)器,使用insert 語句添加一行或多行到 vendors中,當(dāng)成功插入后顯示add a vendor
只有表才支持觸發(fā)器,視圖不支持(臨時表也不支持)
觸發(fā)器按每個表每個事件每次的定義,每個表每個事件每次只允許一個觸發(fā)器。因此每個表最多支持6個觸發(fā)器(每條insert,update,delete之前和之后)
單一觸發(fā)器不能與多個事件或多個表關(guān)聯(lián),所以如果你需要對一個insert 和update 操作執(zhí)行的觸發(fā)器,則應(yīng)該定義兩個觸發(fā)器。
如果BEFORE 觸發(fā)器失敗,則MySQL將不執(zhí)行請求的操作。此外如果before 觸發(fā)器或語句本身失敗,MySQL將不執(zhí)行AFTER 觸發(fā)器
刪除觸發(fā)器(DROP TRIGGER)
drop trigger 觸發(fā)器名字
觸發(fā)器不能更新或覆蓋,為了修改一個觸發(fā)器,必須刪除它,然后再重新創(chuàng)建
使用觸發(fā)器
ONE、INSERT 觸發(fā)器
insert 觸發(fā)器在insert 語句之前或之后執(zhí)行。
1、在insert 觸發(fā)器代碼內(nèi),可引用一個名為 NEW 的虛擬表,訪問被插入的行
2、在before insert 觸發(fā)器,new中的值也可以被更新(允許更改被插入的值)
3、對于auto_increment 列,new 在insert 執(zhí)行之前含0,在inset 執(zhí)行之后包含新的自動生成值。
create11
創(chuàng)建一個名為tri_neworders的觸發(fā)器,他按照after insert on orders 執(zhí)行。在插入一個新訂單到orders 表時,MySQL生成一個新的訂單號并保存到order_num 中,觸發(fā)器從 NEW.order_num 取得這個值并返回他,此觸發(fā)器必須按照after insert 執(zhí)行,因為在before insert 語句執(zhí)行之前,新order_num 還沒有生成,對于orders 的每次插入使用這個觸發(fā)器將總是返回新的訂單號。
將defore 用于數(shù)據(jù)驗證和凈化(目的是保證插入表中的數(shù)據(jù)確實是需要的數(shù)據(jù)),
TWO、DELETE 觸發(fā)器
delete 觸發(fā)器在delete 語句執(zhí)行之前或之后執(zhí)行
在delete 觸發(fā)器代碼內(nèi),你可以引用一個名為old 的虛擬表,訪問被刪除的行
old 中的值全部都是只讀的,不能更新
mysql在任意訂單刪除前將執(zhí)行此觸發(fā)器。它使用一條insert語句將old 中的值(即要刪除的訂單),保存到一個名為 test_orders 的表中
注意: test_orders 和 archive_orders這兩個表的列和列的數(shù)據(jù)類型要一致
使用before delete 觸發(fā)器相對于after delete 觸發(fā)器的優(yōu)點為:
如果(before delete 觸發(fā)器)由于某種原因訂單不能存檔,delete 本身將被放棄
上述,觸發(fā)器(trigger) 使用begin 和end 語句標(biāo)記觸發(fā)器體,的好處是觸發(fā)器能容納多條sql 語句。
Three、UPDATE 觸發(fā)器
update 觸發(fā)器在update 語句執(zhí)行之前或之后執(zhí)行
1、在update 觸發(fā)器代碼中,你可以引用一個名為old的虛擬表訪問以前(update 語句前) 的值,引用一個名為new 的虛擬表訪問新更新的值
2、在before update 觸發(fā)器中,new 中的值可能被更新(允許更改將要用于update 語句中的值)
3、old 中的值全都是只讀的,不能更新。
mysql任何數(shù)據(jù)凈化都需要在update語句之前進(jìn)行,就想這個例子中一樣,每次更新一個行時,new.vend_state中的值(將用來更新表行的值)都用upper(new.vend_state)替換。
end!!!
1、與其他DBMS 相比,MySQL 5 中支持的觸發(fā)器相當(dāng)初級,未來的MySQL版本中有一些改進(jìn)和增強觸發(fā)器支持的計劃。
2、創(chuàng)建觸發(fā)器可能需要特殊的安全訪問權(quán)限,但是觸發(fā)器的執(zhí)行時是自動的。如果insert、update和 delete語句能夠執(zhí)行,則相關(guān)的觸發(fā)器也能執(zhí)行
3、應(yīng)該用觸發(fā)器來保證數(shù)據(jù)的一致性(大小寫、格式等),在觸發(fā)器中執(zhí)行這種類型的處理的優(yōu)點是他總是進(jìn)行這種處理,而且是透明地進(jìn)行,與客戶機應(yīng)用無關(guān)。
4、觸發(fā)器的一種非常有意義的使用是創(chuàng)建審計跟蹤。使用觸發(fā)器,把更改(如果需要,甚至還有之前和之后的狀態(tài))記錄到另一個表非常容易。
5、遺憾的是,MySQL觸發(fā)器中不支持call 語句,這表示不能從觸發(fā)器內(nèi)調(diào)用存儲過程,所需的存儲過程代碼需要復(fù)制到觸發(fā)器內(nèi)。
總結(jié)
以上是生活随笔為你收集整理的mysql多字段修改update_MySQL ------ 触发器(TRIGGER)(二十七)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何利用旧硬盘怎样才能把旧的硬盘当优盘使
- 下一篇: 广汽汇理汽车金融发行80亿元ABS