MySQL触发器学习

简介

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,插入记录观察结果。

 1 -- 创建表tri_test
 2 CREATE TABLE tri_test(id INT auto_increment, note VARCHAR(20), PRIMARY KEY (id))
 3 
 4 -- 创建before insert触发器
 5 CREATE TRIGGER ins_student_bef BEFORE INSERT ON student FOR EACH ROW
 6 BEGIN
 7     INSERT INTO tri_test (note)
 8 VALUES
 9     ('before insert');
10 END;
11 
12 -- 创建after insert触发器
13 CREATE TRIGGER ins_student_aft AFTER INSERT ON student FOR EACH ROW
14 BEGIN
15     INSERT INTO tri_test (note)
16 VALUES
17     ('after insert');
18 END;
19 
20 -- 创建before update触发器
21 CREATE TRIGGER upd_student_bef BEFORE UPDATE ON student FOR EACH ROW
22 BEGIN
23     INSERT INTO tri_test (note)
24 VALUES
25     ('before update');
26 END;
27 
28 -- 创建after update触发器
29 CREATE TRIGGER upd_student_aft AFTER UPDATE ON student FOR EACH ROW
30 BEGIN
31     INSERT INTO tri_test (note)
32 VALUES
33     ('after update');
34 END;
View Code

 现在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

可以通过SHOW TRIGGERS命令来查看触发器的状态、语法等信息,此命令查询的是所有触发器的信息

查询系统表

通过查询系统表中的information_schema.triggers表,可以查询指定触发器的信息

查询指定触发器"ins_student"的信息

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值