首頁 >資料庫 >mysql教程 >MySql資料庫觸發器如何使用

MySql資料庫觸發器如何使用

WBOY
WBOY轉載
2023-05-27 10:02:072759瀏覽

    一、介紹

    1、觸發器是一種特殊的預存程序。觸發器和預存程序一樣,是能夠完成特定功能、儲存在資料庫伺服器上的SQL片段,但是觸發器無語調用,當對資料庫表中的資料執行DML操作時自動觸發這個SQL片段的執行,無需手動調用。

    2、在MySql中,只有執行insert,delete,update操作時才能觸發觸發器的執行

    3、觸發器的這種特性可以協助應用在資料庫端確保資料的完整性,日誌記錄,資料校驗等操作

    4、使用別名OLD和NEW來引用觸發器中發生變化的記錄內容,這與其他的資料庫是相似的,現在觸發器只支援行級觸發,不支援語句級觸發

    二、操作

    1、表格資料準備

    # 用户表
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for users
    -- ----------------------------
    DROP TABLE IF EXISTS `users`;
    CREATE TABLE `users`  (
      `id` int(10) NOT NULL AUTO_INCREMENT COMMENT '主键',
      `user_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',
      `sex` varchar(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '性别',
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;
    
    
    # 用户操作日志表
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for user_log
    -- ----------------------------
    DROP TABLE IF EXISTS `user_log`;
    CREATE TABLE `user_log`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL,
      `create_time` datetime(0) DEFAULT NULL,
      PRIMARY KEY (`id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
    
    SET FOREIGN_KEY_CHECKS = 1;

    2、觸發器格式

    # 创建只有一个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    执行语句;
    
    # 创建有多个执行语句的触发器
    
    create trigger 触发器名 before|after 触发事件
    on 表名 for each row
    begin  
       执行语句列表
    end;

    3、操作

    drop TRIGGER if EXISTS TRIGGER_test;
    -- 需求1:当users表添加一行数据,则会自动在user_log添加日志记录
    delimiter $$
    CREATE TRIGGER TRIGGER_test after INSERT
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES('添加了一条数据',NOW());
    end $$
    delimiter ;
    
    INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');
    
    
    -- 需求2:当users表修改一行数据,则会自动在user_log添加日志记录
    drop TRIGGER if EXISTS TRIGGER_test1;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test1  BEFORE UPDATE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES('修改了一条数据',NOW());
    end $$
    delimiter ;
    
    update users set user_name='迪丽热巴' WHERE id=3;

    三、觸發器NEW和OLD的使用

    MySql中定義了NEW和OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據,來引用觸發器中發生變化的記錄內容。

    MySql資料庫觸發器如何使用

    使用方法:NEW.columnName (columnName為對應資料表某一列名稱)

    1、案例

    -- 案例一
    drop TRIGGER if EXISTS TRIGGER_test2;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test2 after INSERT
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('添加的用户信息为:',NEW.user_name,' 性别为:',NEW.sex ),NOW());
    end $$
    delimiter ;
    
    INSERT INTO users(user_name,sex) VALUES('xiaohemaio','男');
    
    
    -- 案例二 
    drop TRIGGER if EXISTS TRIGGER_test3;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test3  BEFORE UPDATE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('将:',OLD.user_name,' 修改为:',NEW.user_name ),NOW());
    end $$
    delimiter ;
    
    update users set user_name='迪丽热巴' WHERE id=4;
    
    -- 案例三
    drop TRIGGER if EXISTS TRIGGER_test4;
    
    delimiter $$
    CREATE TRIGGER TRIGGER_test4  BEFORE DELETE
    on users FOR EACH ROW
    BEGIN
    INSERT INTO user_log(content,create_time) VALUES(CONCAT('将id为:',OLD.user_name,' 已删除' ),NOW());
    end $$
    delimiter ;
    
    DELETE FROM  users WHERE id=4;

    MySql資料庫觸發器如何使用

    #四、其他操作

    -- 查看触发器
    SHOW TRIGGERS;
    
    -- 删除触发器
    drop TRIGGER if EXISTS 触发器名;

    五、注意事項

    1、觸發器中無法對本表進行insert,update,delete操作,以免遞迴循環觸發

    2、盡量少使用觸發器,假設觸發器觸發每次執行1s,insert table 500條數據,那麼就需要觸發500次觸發器,光是觸發器執行的時間就花費了500s,而insert 500條數據一共是1s,那麼這個insert 的效率就非常低了。

    3、觸發器是針對每一行的數據,對增刪改非常頻繁的表上切記不要使用觸發器,因為非常消耗資源。

    補充:驗證觸發器

    向使用者表users插入資料。

    mysql> INSERT INTO users (userName, password, name, nickName, sex, email, isManager) VALUE ('itbilu', 'e10adc3949ba59abbe56e057f20f883e', 'IT笔录', 'itbilu', 1, 'cn.liuht@gmail.com', 0);

    users原來沒有數據,剛插入的數據userId為1。向用戶表角色表userRoles插入數據,使觸發器觸發:

    mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);

    剛才插入的數據已經使觸發器觸發,查看結果如下:

    mysql> select isManager from users;
    +-----------+
    | isManager |
    +-----------+
    |         1 |
    +-----------+

    以上是MySql資料庫觸發器如何使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述:
    本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除