国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > MySQL > 正文

學習筆記之MySQL觸發器詳解

2024-07-24 12:38:23
字體:
來源:轉載
供稿:網友

觸發器是由事件來觸發某個操作,這些事件包括INSERT語句,UPDATE語句和DELETE語句.

創建觸發器:創建只有一個執行語句的觸發器.

CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件,ON 表名 FOR EACH ROW 執行語句其中,觸發器名參數指要創建的觸發器的名字.

1、創建MySQL觸發器:

語法:代碼如下:

  1. CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name  
  2.  
  3. FOR EACH ROW  
  4.  
  5. BEGIN  
  6.  
  7. trigger_stmt  
  8.  
  9. END;  
  10.  
  11. CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name 
  12.  
  13. FOR EACH ROW  
  14.  
  15. BEGIN 
  16.  
  17. trigger_stmt 
  18.  
  19. END; 

例子,代碼如下:

  1. CREATE TRIGGER SetUserHome after insert ON users  
  2.  
  3. FOR EACH ROW  
  4.  
  5. BEGIN  
  6.  
  7. update `users` set homeLocationX = 128, 
  8.  
  9. homeLocationY=128, homeLocationZ=30  
  10. --Vevb.com 
  11. where uuid = NEW.uuid 
  12.  
  13. END  

以上的例子是錯誤的,讓本表進行觸發時進行更新會讓程序進入死循環,系統會報這樣的錯誤:it is already used by statement which invoked this stored function/trigger.

應該改成以下語句:

  1. CREATE TRIGGER SetUserHome before insert ON users  
  2.  
  3. FOR EACH ROW  
  4.  
  5. BEGIN  
  6.  
  7. set New.homeLocationX = 128; 
  8.  
  9. set New.homeLocationY = 128; 
  10.  
  11. set New.homeLocationZ=30;  
  12.  
  13. END 

BEFORE和AFTER參數指定了觸發執行的時間,在事件之前或是之后,FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器,代碼如下:

  1. mysql> CREATE TRIGGER trig1 AFTER INSERT 
  2.     -> ON work FOR EACH ROW 
  3.     -> INSERT INTO time VALUES(NOW()); 

Query OK, 0 rows affected (0.09 sec)上面創建了一個名為trig1的觸發器,一旦在work中有插入動作,就會自動往time表里插入當前時間.

創建有多個執行語句的觸發器

CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件

ON 表名 FOR EACH ROW

BEGIN

執行語句列表

END其中,BEGIN與END之間的執行語句列表參數表示需要執行的多個語句,不同語句用分號隔開.

tips:一般情況下,mysql默認是以 ; 作為結束執行語句,與觸發器中需要的分行起沖突,為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結束符號變成||,當觸發器創建完成后,可以用DELIMITER ;來將結束符號變成;代碼如下:

  1. mysql> DELIMITER || 
  2. mysql> CREATE TRIGGER trig2 BEFORE DELETE 
  3.     -> ON work FOR EACH ROW 
  4.     -> BEGIN 
  5.     -> INSERT INTO time VALUES(NOW()); 
  6.     -> INSERT INTO time VALUES(NOW()); 
  7.     -> END 
  8.     -> || 
  9. Query OK, 0 rows affected (0.06 sec) 

mysql> DELIMITER ;上面的語句中,開頭將結束符號定義為||,中間定義一個觸發器,一旦有滿足條件的刪除操作,就會執行BEGIN和END中的語句,接著使用||結束,最后使用DELIMITER ; 將結束符號還原.

查看觸發器:

SHOW TRIGGERS語句查看觸發器信息,代碼如下:

  1. mysql> SHOW TRIGGERSG; 
  2. *************************** 1. row *************************** 
  3.              Trigger: trig1 
  4.                Event: INSERT 
  5.                Tablework 
  6.            Statement: INSERT INTO time VALUES(NOW()) 
  7.               Timing: AFTER 
  8.              Created: NULL 
  9.             sql_mode:  
  10.              Definer: root@localhost 
  11. character_set_client: utf8 
  12. collation_connection: utf8_general_ci 

Database Collation: latin1_swedish_ci結果會顯示所有觸發器的基本信息

tips:SHOW TRIGGERS語句無法查詢指定的觸發器

在triggers表中查看觸發器信息,代碼如下:

  1. mysql> SELECT * FROM information_schema.triggersG 
  2. *************************** 1. row *************************** 
  3.            TRIGGER_CATALOG: def --Vevb.com 
  4.             TRIGGER_SCHEMA: person 
  5.               TRIGGER_NAME: trig1 
  6.         EVENT_MANIPULATION: INSERT 
  7.       EVENT_OBJECT_CATALOG: def 
  8.        EVENT_OBJECT_SCHEMA: person 
  9.         EVENT_OBJECT_TABLE: work 
  10.               ACTION_ORDER: 0 
  11.           ACTION_CONDITION: NULL 
  12.           ACTION_STATEMENT: INSERT INTO time VALUES(NOW())  

結果顯示了所有觸發器的詳細信息,同時,該方法可以查詢制定觸發器的詳細信息,代碼如下:

  1. mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'
  2. *************************** 1. row *************************** 
  3.            TRIGGER_CATALOG: def 
  4.             TRIGGER_SCHEMA: person 
  5.               TRIGGER_NAME: trig1 
  6.         EVENT_MANIPULATION: INSERT 
  7.       EVENT_OBJECT_CATALOG: def 
  8.        EVENT_OBJECT_SCHEMA: person 
  9.         EVENT_OBJECT_TABLE: worktips  

所有觸發器信息都存儲在information_schema數據庫下的triggers表中,可以使用SELECT語句查詢,如果觸發器信息過多,最好通過TRIGGER_NAME字段指定查詢.

刪除觸發器

mysql> DROP TRIGGER trig1;

Query OK, 0 rows affected (0.04 sec)刪除觸發器之后最好使用上面的方法查看一遍.同時,也可以使用database.trig來指定某個數據庫中的觸發器

tips:如果不需要某個觸發器時一定要將這個觸發器刪除,以免造成意外操作.

 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长乐市| 江油市| 平乐县| 许昌市| 奉化市| 永康市| 楚雄市| 平原县| 漳浦县| 朝阳市| 车致| 南通市| 饶平县| 个旧市| 集贤县| 张家口市| 额济纳旗| 汝城县| 苏州市| 吉安市| 岳西县| 玉门市| 渭南市| 望城县| 邯郸县| 新宾| 霍州市| 吉隆县| 嵊州市| 新民市| 盖州市| 陵川县| 钟山县| 项城市| 新蔡县| 如皋市| 苗栗市| 汶川县| 民丰县| 防城港市| 崇阳县|