mysql之触发器详解_学习笔记之MySQL触发器详解
觸發(fā)器是由事件來觸發(fā)某個操作,這些事件包括INSERT語句,UPDATE語句和DELETE語句
創(chuàng)建觸發(fā)器
創(chuàng)建只有一個執(zhí)行語句的觸發(fā)器
CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
ON 表名 FOR EACH ROW 執(zhí)行語句其中,觸發(fā)器名參數(shù)指要創(chuàng)建的觸發(fā)器的名字
1、創(chuàng)建MySQL觸發(fā)器:
語法:
代碼如下
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW
BEGIN
trigger_stmt
END;
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW
BEGIN
trigger_stmt
END;
例子
代碼如下
CREATE TRIGGER SetUserHome after insert ON users
FOR EACH ROW
BEGIN
update `users` set homeLocationX = 128,
homeLocationY=128, homeLocationZ=30
where uuid = NEW.uuid
END
以上的例子是錯誤的, 讓本表進行觸發(fā)時進行更新會讓程序進入死循環(huán)。
系統(tǒng)會報這樣的錯誤:it is already used by statement which invoked this stored function/trigger.
應(yīng)該改成以下語句:
代碼如下
CREATE TRIGGER SetUserHome before insert ON users
FOR EACH ROW
BEGIN
set New.homeLocationX = 128;
set New.homeLocationY = 128;
set New.homeLocationZ=30;
END
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 TRIGGERSG;
*************************** 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.triggersG
*************************** 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: worktips
:所有觸發(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ā)器刪除,以免造成意外操
本條技術(shù)文章來源于互聯(lián)網(wǎng),如果無意侵犯您的權(quán)益請點擊此處反饋版權(quán)投訴
本文系統(tǒng)來源:php中文網(wǎng)
總結(jié)
以上是生活随笔為你收集整理的mysql之触发器详解_学习笔记之MySQL触发器详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac python3打包成窗体程序_p
- 下一篇: 单引号和冒号不能存入mysql么_mys