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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

13、创建触发器(CREATE TRIGGER)

發布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 13、创建触发器(CREATE TRIGGER) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

觸發器是與 MySQL 數據表有關的數據庫對象,在滿足定義條件時觸發,并執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在數據庫端確保數據的完整性。

基本語法

在 MySQL 5.7 中,可以使用 CREATE TRIGGER 語句創建觸發器。

語法格式如下:

CREATE <觸發器名> < BEFORE | AFTER > <INSERT | UPDATE | DELETE > ON <表名> FOR EACH Row<觸發器主體>

語法說明如下。
1) 觸發器名
觸發器的名稱,觸發器在當前數據庫中必須具有唯一的名稱。如果要在某個特定數據庫中創建,名稱前面應該加上數據庫的名稱。

2) INSERT | UPDATE | DELETE
觸發事件,用于指定激活觸發器的語句的種類。

注意:三種觸發器的執行時間如下。
INSERT:將新行插入表時激活觸發器。例如,INSERT 的 BEFORE 觸發器不僅能被 MySQL 的 INSERT 語句激活,也能被 LOAD DATA 語句激活。
DELETE: 從表中刪除某一行數據時激活觸發器,例如 DELETE 和 REPLACE 語句。
UPDATE:更改表中某一行數據時激活觸發器,例如 UPDATE 語句。

3) BEFORE | AFTER
BEFORE 和 AFTER,觸發器被觸發的時刻,表示觸發器是在激活它的語句之前或之后觸發。若希望驗證新數據是否滿足條件,則使用 BEFORE 選項;若希望在激活觸發器的語句執行之后完成幾個或更多的改變,則通常使用 AFTER 選項。

4) 表名
與觸發器相關聯的表名,此表必須是永久性表,不能將觸發器與臨時表或視圖關聯起來。在該表上觸發事件發生時才會激活觸發器。同一個表不能擁有兩個具有相同觸發時刻和事件的觸發器。例如,對于一張數據表,不能同時有兩個 BEFORE UPDATE 觸發器,但可以有一個 BEFORE UPDATE 觸發器和一個 BEFORE INSERT 觸發器,或一個 BEFORE UPDATE 觸發器和一個 AFTER UPDATE 觸發器。

5) 觸發器主體
觸發器動作主體,包含觸發器激活時將要執行的 MySQL 語句。如果要執行多個語句,可使用 BEGIN…END 復合語句結構。

6) FOR EACH ROW
一般是指行級觸發,對于受觸發事件影響的每一行都要激活觸發器的動作。例如,使用 INSERT 語句向某個表中插入多行數據時,觸發器會對每一行數據的插入都執行相應的觸發器動作。

注意:每個表都支持 INSERT、UPDATE 和 DELETE 的 BEFORE 與 AFTER,因此每個表最多支持 6
個觸發器。每個表的每個事件每次只允許有一個觸發器。單一觸發器不能與多個事件或多個表關聯。

另外,在 MySQL 中,若需要查看數據庫中已有的觸發器,則可以使用 SHOW TRIGGERS 語句。

創建一個簡單的觸發器

CREATE TRIGGER 觸發器名稱 ON 表名 FOR INSERTUPDATEDELETE AST-SQL 語句

注意:觸發器名稱是不加引號的。

創建 BEFORE 類型觸發器

在 test_db 數據庫中,數據表 tb_emp8 為員工信息表,包含 id、name、deptId 和 salary 字段,數據表 tb_emp8 的表結構如下所示。

mysql> SELECT * FROM tb_emp8; Empty set (0.07 sec) mysql> DESC tb_emp8; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(22) | YES | UNI | NULL | | | deptId | int(11) | NO | MUL | NULL | | | salary | float | YES | | 0 | | +--------+-------------+------+-----+---------+-------+

【實例 1】創建一個名為 SumOfSalary 的觸發器,觸發的條件是向數據表 tb_emp8 中插入數據之前,對新插入的 salary 字段值進行求和計算。輸入的 SQL 語句和執行過程如下所示。

mysql> CREATE TRIGGER SumOfSalary-> BEFORE INSERT ON tb_emp8-> FOR EACH ROW-> SET @sum=@sum+NEW.salary;

觸發器 SumOfSalary 創建完成之后,向表 tb_emp8 中插入記錄時,定義的 sum 值由 0 變成了 1500,即插入值 1000 和 500 的和,如下所示。

SET @sum=0; 設置sum為0 mysql> INSERT INTO tb_emp8-> VALUES(1,'A',1,1000),(2,'B',1,500); 執行觸發器,@sum加salary mysql> SELECT @sum; 觸發器 +------+ | @sum | +------+ | 1500 | +------+

創建 AFTER 類型觸發器

在 test_db 數據庫中,數據表 tb_emp6 和 tb_emp7 都為員工信息表,包含 id、name、deptId 和 salary 字段,數據表 tb_emp6 和 tb_emp7 的表結構如下所示。

mysql> DESC tb_emp6; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | MUL | NULL | | | salary | float | YES | | NULL | | +--------+-------------+------+-----+---------+-------+ mysql> DESC tb_emp7; +--------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +--------+-------------+------+-----+---------+-------+ | id | int(11) | NO | PRI | NULL | | | name | varchar(25) | YES | | NULL | | | deptId | int(11) | YES | | NULL | | | salary | float | YES | | 0 | | +--------+-------------+------+-----+---------+-------+

【實例 2】創建一個名為 double_salary 的觸發器,觸發的條件是向數據表 tb_emp6 中插入數據之后,再向數據表 tb_emp7 中插入相同的數據,并且 salary 為 tb_emp6 中新插入的 salary 字段值的 2 倍。輸入的 SQL 語句和執行過程如下所示。

mysql> CREATE TRIGGER double_salary-> AFTER INSERT ON tb_emp6-> FOR EACH ROW-> INSERT INTO tb_emp7-> VALUES (NEW.id,NEW.name,deptId,2*NEW.salary);

觸發器 double_salary 創建完成之后,向表 tb_emp6 中插入記錄時,同時向表 tb_emp7 中插入相同的記錄,并且 salary 字段為 tb_emp6 中 salary 字段值的 2 倍,如下所示。

mysql> INSERT INTO tb_emp6-> VALUES (1,'A',1,1000),(2,'B',1,500); mysql> SELECT * FROM tb_emp6; +----+------+--------+--------+ | id | name | deptId | salary | +----+------+--------+--------+ | 1 | A | 1 | 1000 | | 2 | B | 1 | 500 | +----+------+--------+--------+ mysql> SELECT * FROM tb_emp7; +----+------+--------+--------+ | id | name | deptId | salary | +----+------+--------+--------+ | 1 | A | 1 | 2000 | | 2 | B | 1 | 1000 | +----+------+--------+--------+

總結

以上是生活随笔為你收集整理的13、创建触发器(CREATE TRIGGER)的全部內容,希望文章能夠幫你解決所遇到的問題。

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