1. 程式人生 > >MySQL觸發器學習

MySQL觸發器學習

rop log ins 創建 spa ble bsp sign aps

簡介

MySQL從5.0.2版本開始支持觸發器的功能。觸發器是與表有關的數據庫對象,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。

創建觸發器

語法:

  CREATE TRIGGER trigger_name trigger_time trigger_event

    ON tb_name FOR EACH ROW trigger_stmt

根據語法來演示如何創建一個觸發器,首先創建2張表:student 和 student_demo

-- CREATE TABLE student
CREATE TABLE `student` (
  `id` int(10) unsigned NOT
NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` tinyint(4) NOT NULL, `gender` enum(,) NOT NULL, `address` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; -- CREATE TABLE student_demo CREATE TABLE `student_demo` ( `id`
int(11) NOT NULL, `name` varchar(255) NOT NULL, `address` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

現在假設在表student新增一條記錄後,student_demo也需新增一條記錄,根據此需求來演示觸發器的創建

-- CREATE TRIGGER ins_student
CREATE TRIGGER ins_student AFTER INSERT ON student FOR EACH ROW
BEGIN INSERT INTO student_demo (id, name, address) VALUES ( new.id, new.name, new.address ); END;

現在為student表創建了AFTER INSERT的觸發器,在向student表插入數據時,student_demo也會插入相應的記錄

技術分享

可以看到,在向student表中新增一個名為"韓梅梅"的學生信息時,student_demo也新增了其對應信息

對於INSERT INTO...ON DUPLICATE KEY UPDATE語句,觸發觸發器的順序有所不同。對student表分別創建BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE,插入記錄觀察結果。

技術分享
 1 -- 創建表tri_test
 2 CREATE TABLE tri_test(id INT auto_increment, note VARCHAR(20), PRIMARY KEY (id))
 3 
 4 -- 創建before insert觸發器
 5 CREATE TRIGGER ins_student_bef BEFORE INSERT ON student FOR EACH ROW
 6 BEGIN
 7     INSERT INTO tri_test (note)
 8 VALUES
 9     (before insert);
10 END;
11 
12 -- 創建after insert觸發器
13 CREATE TRIGGER ins_student_aft AFTER INSERT ON student FOR EACH ROW
14 BEGIN
15     INSERT INTO tri_test (note)
16 VALUES
17     (after insert);
18 END;
19 
20 -- 創建before update觸發器
21 CREATE TRIGGER upd_student_bef BEFORE UPDATE ON student FOR EACH ROW
22 BEGIN
23     INSERT INTO tri_test (note)
24 VALUES
25     (before update);
26 END;
27 
28 -- 創建after update觸發器
29 CREATE TRIGGER upd_student_aft AFTER UPDATE ON student FOR EACH ROW
30 BEGIN
31     INSERT INTO tri_test (note)
32 VALUES
33     (after update);
34 END;
View Code

現在student表中已有一條記錄

技術分享

現在對id=3的記錄,插入數據

INSERT INTO student
VALUES
    (
        3,
        李雷,
        20,
        ,
        河北石家莊
    ) ON DUPLICATE KEY UPDATE NAME = update record

表student和tri_test中的數據為:

技術分享

對於有重復記錄、需要進行UPDATE的INSERT操作,觸發器出發的順序是BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE

如果是插入新的不重復的數據

INSERT INTO student
VALUES
    (
        6,
        大衛,
        20,
        ,
        河北保定
    ) ON DUPLICATE KEY UPDATE NAME = update record

則表數據為

技術分享

觸發器的順序為BEFORE INSERT、AFTER INSERT

刪除觸發器

一次可刪除一個觸發器,如果沒有指定則默認為當前數據庫。語法如下:

DROP TRIGGER [schema_name.]trigger_name

例如,要刪除觸發器ins_student,可以執行

技術分享

查看觸發器

SHOW TRIGGERS

可以通過SHOW TRIGGERS命令來查看觸發器的狀態、語法等信息,此命令查詢的是所有觸發器的信息

查詢系統表

通過查詢系統表中的information_schema.triggers表,可以查詢指定觸發器的信息

技術分享

查詢指定觸發器"ins_student"的信息

技術分享

MySQL觸發器學習