MySQL 从 5.0.2 版本开始支持触发器的功能。触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。
语法:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tb_name FOR EACH ROW trigger_stmt
根据语法来演示如何创建一个触发器,首先创建 2 张表:student 和 student_demo
- -- CREATE TABLE student
- CREATE TABLE `student` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `name` varchar(255) NOT NULL,
- `age` tinyint(4) NOT NULL,
- `gender` enum('女','男') NOT NULL,
- `address` varchar(255) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
- -- CREATE TABLE student_demo
- CREATE TABLE `student_demo` (
- `id` int(11) NOT NULL,
- `name` varchar(255) NOT NULL,
- `address` varchar(255) NOT NULL,
- PRIMARY KEY (`id`)
- ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
现在假设在表 student 新增一条记录后,student_demo 也需新增一条记录,根据此需求来演示触发器的创建
- -- CREATE TRIGGER ins_student
- CREATE TRIGGER ins_student AFTER INSERT ON student FOR EACH ROW
- BEGIN
- INSERT INTO student_demo (id, name, address)
- VALUES
- (
- new.id,
- new.name,
- new.address
- );
- END;
现在为 student 表创建了 AFTER INSERT 的触发器,在向 student 表插入数据时,student_demo 也会插入相应的记录
可以看到,在向 student 表中新增一个名为 "韩梅梅" 的学生信息时,student_demo 也新增了其对应信息
对于 INSERT INTO...ON DUPLICATE KEY UPDATE 语句,触发触发器的顺序有所不同。对 student 表分别创建 BEFORE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE,插入记录观察结果。
- -- 创建表tri_test
- CREATE TABLE tri_test(id INT auto_increment, note VARCHAR(20), PRIMARY KEY (id))
- -- 创建before insert触发器
- CREATE TRIGGER ins_student_bef BEFORE INSERT ON student FOR EACH ROW
- BEGIN
- INSERT INTO tri_test (note)
- VALUES
- ('before insert');
- END;
- -- 创建after insert触发器
- CREATE TRIGGER ins_student_aft AFTER INSERT ON student FOR EACH ROW
- BEGIN
- INSERT INTO tri_test (note)
- VALUES
- ('after insert');
- END;
- -- 创建before update触发器
- CREATE TRIGGER upd_student_bef BEFORE UPDATE ON student FOR EACH ROW
- BEGIN
- INSERT INTO tri_test (note)
- VALUES
- ('before update');
- END;
- -- 创建after update触发器
- CREATE TRIGGER upd_student_aft AFTER UPDATE ON student FOR EACH ROW
- BEGIN
- INSERT INTO tri_test (note)
- VALUES
- ('after update');
- END;
现在 student 表中已有一条记录
现在对 id=3 的记录,插入数据
- INSERT INTO student
- VALUES
- (
- 3,
- '李雷',
- 20,
- '男',
- '河北石家庄'
- ) ON DUPLICATE KEY UPDATE NAME = 'update record'
表 student 和 tri_test 中的数据为:
对于有重复记录、需要进行 UPDATE 的 INSERT 操作,触发器出发的顺序是 BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE
如果是插入新的不重复的数据
- INSERT INTO student
- VALUES
- (
- 6,
- '大卫',
- 20,
- '男',
- '河北保定'
- ) ON DUPLICATE KEY UPDATE NAME = 'update record'
则表数据为
触发器的顺序为 BEFORE INSERT、AFTER INSERT
一次可删除一个触发器,如果没有指定则默认为当前数据库。语法如下:
- DROP TRIGGER[schema_name.] trigger_name
例如,要删除触发器 ins_student,可以执行
可以通过 SHOW TRIGGERS 命令来查看触发器的状态、语法等信息,此命令查询的是所有触发器的信息
通过查询系统表中的 information_schema.triggers 表,可以查询指定触发器的信息
查询指定触发器 "ins_student" 的信息
来源: http://www.cnblogs.com/feanmy/p/7400339.html