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