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表里插入當(dāng)前時間
創(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é)束符號變成||
當(dāng)觸發(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導(dǎo)入sql文件命令和mysql遠程登陸使用詳解
這篇文章主要介紹了mysql導(dǎo)入sql文件命令和mysql遠程登陸使用詳解,需要的朋友可以參考下2014-04-04
MySQL中的FIND_IN_SET函數(shù)的使用場景
MySQL 中的?FIND_IN_SET()?函數(shù)用于在一個逗號分隔的字符串列表中查找指定的值,并返回其在列表中的位置,下面就來介紹一下FIND_IN_SET函數(shù)的具體使用,感興趣的可以了解一下2024-05-05
MySQL在右表數(shù)據(jù)不唯一的情況下使用left join的方法
這篇文章主要介紹了MySQL在右表數(shù)據(jù)不唯一的情況下使用left join的方法,針對右表符合條件表達式的記錄數(shù)大于1條時left join所顯示的結(jié)果需求來講,需要的朋友可以參考下2016-03-03
MySQL數(shù)據(jù)庫算術(shù)運算舉例詳解
這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫算術(shù)運算的相關(guān)資料,MySQL支持的算術(shù)運算符包括加、減、乘、除和模運算,它們是最常使用、最簡單的一類運算符,需要的朋友可以參考下2024-01-01
MySQL中使用group by 是總是出現(xiàn)1055的錯誤(推薦)
這篇文章主要介紹了MySQL中使用group by 是總是出現(xiàn)1055的錯誤,小編通過查閱相關(guān)資料才把問題解決,今天小編記錄下分享到腳本之家平臺,需要的朋友可以參考下2020-02-02

