1.创建一个测试表学生表stu,和一个用来记录触发器日志的表stu_log
CREATE TABLE stu(
id INT PRIMARY KEY AUTO_INCREMENT,
stuname VARCHAR(10),
stuage INT,
stunumber VARCHAR(6) UNIQUE
);
CREATE TABLE stu_log(
id INT PRIMARY KEY AUTO_INCREMENT,
dowhat VARCHAR (10),
dotime DATE,
newdata VARCHAR(100),
olddata VARCHAR(100)
);
2.为学生表创建一个插入事件的触发器
这里我们需要思考一下,对于插入事件,数据表中插入后肯定只有产生新数据的事件,所以我们把新数据给记录到日志中。
创建触发器模板
/*
创建触发器
DELIMITER $
CREATE TRIGGER 触发器名称
BEFORE|AFTER INSERT|UPDATE|DELETE
ON 表名
FOR EACH ROW
BEGIN
触发器要执行的功能;
END$
DELIMITER ;
*/
创建一个触发器
DELIMITER $
CREATE TRIGGER stu_insert_trigger
AFTER INSERT
ON stu
FOR EACH ROW
BEGIN
INSERT INTO stu_log VALUES (NULL,'INSERT',NOW(),CONCAT('{id=',new.id,';stuname=',new.stuname,';stuage=',new.stuage,';stunumber=',new.stunumber,'}'),NULL);
END $
DELIMITER ;```
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210321192038945.png)
插入几条数据看看
```sql
INSERT INTO stu VALUES (NULL,'张三',18,'gy1000'),
(NULL,'李四',20,'gy1001');
查看日志表
这里只演示效果,图随便截取的
3.为学生表创建一个删除触发器
注意:
删除只有老数据,没有新数据
当然你用了new关键字会报错
DELIMITER $
CREATE TRIGGER stu_delete_trigger
AFTER DELETE
ON stu
FOR EACH ROW
BEGIN
INSERT INTO stu_log VALUES (NULL,'DELETE',NOW(),NULL,CONCAT('{id=',old.id,';stuname=',old.stuname,';stuage=',old.stuage,';stunumber=',old.stunumber,'}'));
END $
DELIMITER ;
删除两个学生
DELETE FROM stu WHERE id IN(1,2);
4.创建一个更新触发器
思考这个更新之前肯定有一个值,我们叫旧值,更新之后我们叫新值。
DELIMITER $
CREATE TRIGGER stu_update_trigger
AFTER UPDATE
FOR EACH ROW
BEGIN
INSERT INTO stu_log VALUES (NULL,'UPDATE',NOW(),NULL,CONCAT('{id=',old.id,';stuname=',old.stuname,';stuage=',old.stuage,';stunumber=',old.stunumber,'}'));
END $
DELIMITER ;
然我们看看学生表中的数据,现在我们对这个表进行跟新操作。
UPDATE stu SET stunumber='gy1001' WHERE stunumber ='gy1003';
UPDATE stu SET stunumber='gy1002' WHERE stunumber ='gy1004';
UPDATE stu SET stunumber='gy1003' WHERE stunumber ='gy1005';
然后我们看看日志表