日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql之触发器详解_学习笔记之MySQL触发器详解

發布時間:2025/3/21 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql之触发器详解_学习笔记之MySQL触发器详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

創建觸發器

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

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

ON 表名 FOR EACH ROW 執行語句其中,觸發器名參數指要創建的觸發器的名字

1、創建MySQL觸發器:

語法:

代碼如下

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

以上的例子是錯誤的, 讓本表進行觸發時進行更新會讓程序進入死循環。

系統會報這樣的錯誤:it is already used by statement which invoked this stored function/trigger.

應該改成以下語句:

代碼如下

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參數指定了觸發執行的時間,在事件之前或是之后

FOR EACH ROW表示任何一條記錄上的操作滿足觸發事件都會觸發該觸發器

代碼如下

mysql> CREATE TRIGGER trig1 AFTER INSERT

-> ON work FOR EACH ROW

-> 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 ;來將結束符號變成;

代碼如下

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 ;上面的語句中,開頭將結束符號定義為||,中間定義一個觸發器,一旦有滿足條件的刪除操作

就會執行BEGIN和END中的語句,接著使用||結束

最后使用DELIMITER ; 將結束符號還原

查看觸發器

SHOW TRIGGERS語句查看觸發器信息

代碼如下

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結果會顯示所有觸發器的基本信息

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

在triggers表中查看觸發器信息

代碼如下

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())

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

代碼如下

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

:所有觸發器信息都存儲在information_schema數據庫下的triggers表中

可以使用SELECT語句查詢,如果觸發器信息過多,最好通過TRIGGER_NAME字段指定查詢

刪除觸發器

mysql> DROP TRIGGER trig1;

Query OK, 0 rows affected (0.04 sec)刪除觸發器之后最好使用上面的方法查看一遍

同時,也可以使用database.trig來指定某個數據庫中的觸發器

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

本條技術文章來源于互聯網,如果無意侵犯您的權益請點擊此處反饋版權投訴

本文系統來源:php中文網

總結

以上是生活随笔為你收集整理的mysql之触发器详解_学习笔记之MySQL触发器详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。