MySQL筆記之觸發(fā)器的應(yīng)用
創(chuàng)建觸發(fā)器
創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器
CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
ON 表名 FOR EACH ROW 執(zhí)行語句
其中,觸發(fā)器名參數(shù)指要創(chuàng)建的觸發(fā)器的名字
BEFORE和AFTER參數(shù)指定了觸發(fā)執(zhí)行的時間,在事件之前或是之后
FOR EACH ROW表示任何一條記錄上的操作滿足觸發(fā)事件都會觸發(fā)該觸發(fā)器
mysql> CREATE TRIGGER trig1 AFTER INSERT
-> ON work FOR EACH ROW
-> INSERT INTO time VALUES(NOW());
Query OK, 0 rows affected (0.09 sec)
上面創(chuàng)建了一個名為trig1的觸發(fā)器,一旦在work中有插入動作,就會自動往time表里插入當前時間
創(chuàng)建有多個執(zhí)行語句的觸發(fā)器
CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
ON 表名 FOR EACH ROW
BEGIN
執(zhí)行語句列表
END
其中,BEGIN與END之間的執(zhí)行語句列表參數(shù)表示需要執(zhí)行的多個語句,不同語句用分號隔開
tips:一般情況下,mysql默認是以 ; 作為結(jié)束執(zhí)行語句,與觸發(fā)器中需要的分行起沖突
為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結(jié)束符號變成||
當觸發(fā)器創(chuàng)建完成后,可以用DELIMITER ;來將結(jié)束符號變成;
mysql> DELIMITER ||
mysql> CREATE TRIGGER trig2 BEFORE DELETE
-> ON work FOR EACH ROW
-> BEGIN
-> INSERT INTO time VALUES(NOW());
-> INSERT INTO time VALUES(NOW());
-> END
-> ||
Query OK, 0 rows affected (0.06 sec)
mysql> DELIMITER ;
上面的語句中,開頭將結(jié)束符號定義為||,中間定義一個觸發(fā)器,一旦有滿足條件的刪除操作
就會執(zhí)行BEGIN和END中的語句,接著使用||結(jié)束
最后使用DELIMITER ; 將結(jié)束符號還原
查看觸發(fā)器
SHOW TRIGGERS語句查看觸發(fā)器信息
mysql> SHOW TRIGGERS\G;
*************************** 1. row ***************************
Trigger: trig1
Event: INSERT
Table: work
Statement: INSERT INTO time VALUES(NOW())
Timing: AFTER
Created: NULL
sql_mode:
Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: latin1_swedish_ci
結(jié)果會顯示所有觸發(fā)器的基本信息
tips:SHOW TRIGGERS語句無法查詢指定的觸發(fā)器
在triggers表中查看觸發(fā)器信息
mysql> SELECT * FROM information_schema.triggers\G
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: person
TRIGGER_NAME: trig1
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: person
EVENT_OBJECT_TABLE: work
ACTION_ORDER: 0
ACTION_CONDITION: NULL
ACTION_STATEMENT: INSERT INTO time VALUES(NOW())
結(jié)果顯示了所有觸發(fā)器的詳細信息,同時,該方法可以查詢制定觸發(fā)器的詳細信息
mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='trig1'\G
*************************** 1. row ***************************
TRIGGER_CATALOG: def
TRIGGER_SCHEMA: person
TRIGGER_NAME: trig1
EVENT_MANIPULATION: INSERT
EVENT_OBJECT_CATALOG: def
EVENT_OBJECT_SCHEMA: person
EVENT_OBJECT_TABLE: work
tips:所有觸發(fā)器信息都存儲在information_schema數(shù)據(jù)庫下的triggers表中
可以使用SELECT語句查詢,如果觸發(fā)器信息過多,最好通過TRIGGER_NAME字段指定查詢
刪除觸發(fā)器
mysql> DROP TRIGGER trig1;
Query OK, 0 rows affected (0.04 sec)
刪除觸發(fā)器之后最好使用上面的方法查看一遍
同時,也可以使用database.trig來指定某個數(shù)據(jù)庫中的觸發(fā)器
tips:如果不需要某個觸發(fā)器時一定要將這個觸發(fā)器刪除,以免造成意外操作
相關(guān)文章
mysql遇到load data導(dǎo)入文件數(shù)據(jù)出現(xiàn)1290錯誤的解決方案
這篇文章主要介紹了mysql遇到load data導(dǎo)入文件數(shù)據(jù)出現(xiàn)1290錯誤的解決方案,非常的簡單實用,有需要的小伙伴可以參考下2018-07-07