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
# 用户表 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;
# 创建只有一个执行语句的触发器 create trigger 触发器名 before|after 触发事件 on 表名 for each row 执行语句; # 创建有多个执行语句的触发器 create trigger 触发器名 before|after 触发事件 on 表名 for each row begin 执行语句列表 end;
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;
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.
Penggunaan: NEW.columnName (columnName ialah nama lajur dalam jadual data yang sepadan)
4. 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;
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
-- 查看触发器 SHOW TRIGGERS; -- 删除触发器 drop TRIGGER if EXISTS 触发器名;
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);
Data yang baru dimasukkan telah mencetuskan pencetus Hasilnya adalah seperti berikut:
mysql> INSERT INTO userRoles (userId, roleId) VALUE (1, 1);
Atas ialah kandungan terperinci Cara menggunakan pencetus pangkalan data MySql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!