触发器是一个特殊的存储过程,当触发器保护的数据发生变更时就会触发。
1.触发器与表息息相关,一般我们一个表创建六个触发器。
2.六个触发器其实是三种类六个
| insert 类型 | before | after insert |
| update 类型 | before | after update |
| delete 类型 | before | after delete |
当我们进行这三个操作时,启动触发器。
- CREATE TRIGGER trigger_name trigger_time trigger_event
- ON table_name
- FOR EACH ROW
- BEGIN
- ...
- END;
创建一个学生表和学生详情表
- -- 创建数据库
- CREATE DATABASE IF NOT EXISTS Test;
-
- -- 使用数据库
- USE Test;
-
- -- 创建表
- CREATE TABLE IF NOT EXISTS student (
- id INT PRIMARY KEY,
- name VARCHAR(255),
- age INT
- );
- -- info详细表
- CREATE TABLE stu_detail (
- id INT PRIMARY KEY,
- stu_id INT,
- name VARCHAR(50),
- age INT,
- address VARCHAR(100),
- phone VARCHAR(20)
- );
-
- -- 向student表中插入多条记录
- INSERT INTO student (id, name, age)
- VALUES (1, 'John', 25),
- (2, 'Jane', 28),
- (3, 'Mike', 30),
- (4, 'Sarah', 22);
-
- -- 向student表中插入多条记录
- INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
- VALUES (1, 1, 'John', 25, '123 Main St', '123-456-7890');
-
- INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
- VALUES (2, 2, 'Jane', 28, '456 Elm St', '987-654-3210');
-
- INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
- VALUES (3, 3, 'Mike', 30, '789 Oak St', '555-123-4567');
-
- INSERT INTO stu_detail (id, stu_id, name, age, address, phone)
- VALUES (4, 4, 'Sarah', 22, '789 Oak St', '555-123-4567');
该触发器作用为:插入student表时,先检查id是否存在,假如存在的话就回滚操作,并给出异常提醒,不存在才可以插入
- DELIMITER //
- CREATE TRIGGER before_insert_Student
- BEFORE INSERT ON student
- FOR EACH ROW
- BEGIN
- DECLARE idExists INT;
- SET idExists = (SELECT COUNT(*) FROM student WHERE id = NEW.id);
- IF idExists > 0 THEN
- SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '插入ID已经存在,不允许插入';
- END IF;
- END//
- DELIMITER ;
测试触发器
id冲突
id不冲突

改触发器功能为:
after update 触发器,当student数据update时,stu_detail表中对应id的记录也随之变更
- -- update 触发器
- CREATE TRIGGER after_update_student
- AFTER UPDATE ON student
- FOR EACH ROW
- BEGIN
- UPDATE stu_detail
- SET name = NEW.name, age = NEW.age
- WHERE id = NEW.id;
- END;
测试触发器
更改成功
查看detail表是否自动变更(可发现成功更改)
创建 AFTER DELETE触发器- CREATE TRIGGER after_delete_student
- AFTER DELETE ON student
- FOR EACH ROW
- BEGIN
- DELETE FROM stu_detail WHERE id = OLD.id;
- END;
最后一个我就不测试了,交给大家去检测一下。
BEFORE : 代表的意识是在我们的操作(insert,update,delete) 之前就执行触发器
AFTER : 代表的意识是在我们的操作(insert,update,delete) 之后才执行触发器
NEW: 对于insert来说,是将要或者已经新增的数据条
对于update来说,是将要或者已经修改的数据条
delete则没有NEW
OLD: 对于delete来说,是将要或者已经删除的数据条
对于update来说,是修改前的数据条
insert则没有OLD
NEW和OLD需要大家想一想就知道是啥意思了。