Cara menggunakan pencetus pangkalan data MySql

WBOY
Lepaskan: 2023-05-27 10:02:07
ke hadapan
2739 orang telah melayarinya

    1. Pengenalan

    1. Pencetus, seperti prosedur tersimpan, ialah serpihan SQL yang boleh melengkapkan fungsi tertentu dan disimpan pada pelayan pangkalan data Walau bagaimanapun, pencetus dipanggil secara senyap Apabila operasi DML dilakukan pada data dalam jadual pangkalan data, pelaksanaan serpihan SQL ini dicetuskan secara automatik tanpa operasi manual.

    2. Dalam MySql, pelaksanaan pencetus hanya boleh dicetuskan apabila operasi memasukkan, memadam dan mengemas kini dilaksanakan

    3. Ciri pencetus ini boleh membantu aplikasi memastikan keselamatan data pada pangkalan data sisi. Integriti, pengelogan, pengesahan data dan operasi lain

    4 Gunakan alias LAMA dan BARU untuk merujuk kepada kandungan rekod yang diubah dalam pencetus. Kini pencetus hanya menyokong baris. Pencetusan tahap, pencetus peringkat pernyataan tidak disokong

    2. Operasi

    1 Penyediaan data jadual

    # 用户表
    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;
    Salin selepas log masuk

    Format pencetus

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

    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;
    Salin selepas log masuk

    3. Penggunaan pencetus BARU dan LAMA

    BARU dan LAMA ditakrifkan dalam MySql, yang digunakan untuk mewakili baris data dalam jadual di mana pencetus terletak, yang mencetuskan pencetus. Merujuk kandungan rekod yang berubah dalam pencetus.

    Cara menggunakan pencetus pangkalan data MySql

    Penggunaan: NEW.columnName (columnName ialah nama lajur dalam jadual data yang sepadan)

    1

    Cara menggunakan pencetus pangkalan data MySql4. Operasi lain

    -- 案例一
    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;
    Salin selepas log masuk

    5. Nota

    1

    2. Gunakan pencetus sesedikit mungkin. Anggapkan pencetus dilaksanakan selama 1s setiap kali dan masukkan jadual 500 data Kemudian pencetus perlu dicetuskan 500 kali masa pelaksanaan pencetus sahaja masukkan 500 Sebanyak satu keping data mengambil masa 1 saat, jadi kecekapan sisipan ini sangat rendah.

    3. Pencetus adalah untuk setiap baris data. Ingat untuk tidak menggunakan pencetus pada jadual di mana penambahan, pemadaman dan pengubahsuaian adalah sangat kerap, kerana ia menggunakan banyak sumber.

    Ditambah: Pencetus pengesahan

    Masukkan data ke dalam pengguna jadual pengguna.

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

    pengguna pada asalnya tidak mempunyai data dan ID pengguna data yang baru dimasukkan ialah 1. Masukkan data ke dalam jadual pengguna jadual peranan userRole untuk mencetuskan pencetus:

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

    Data yang baru dimasukkan telah mencetuskan pencetus Hasilnya adalah seperti berikut:

    mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);
    Salin selepas log masuk

    Atas ialah kandungan terperinci Cara menggunakan pencetus pangkalan data MySql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:yisu.com
    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan