ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

MySQL学习笔记十一:触发器

2020-09-10 23:01:48  阅读:220  来源: 互联网

标签:触发器 DEFAULT MySQL 笔记 TRIGGER EMP1 NEW ID


一、触发器概念

触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。

二、触发器创建

2.1、创建语法

CREATE [DEFINER = { 'user' | CURRENT_USER }] 
TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
[trigger_order]
trigger_body

2.2、创建语法关键词解释

2.3、触发执行内容OLD与NEW

OLD:表示将要删除的旧行(类似于SQL Server中的DELETED表,只不过前者是行记录,后者是表)。

NEW:表示将要插入的新行(类似于SQL Server中的INSERTED表,只不过前者是行记录,后者是表)。

注:因为是单行记录,可以将它们理解为面向对象语言中的对象,直接通过`OLD.字段名`和`NEW.字段名`来使用。

事件与OLD、NEW的对应关系:

由上可见,更新一条记录,实际上是先将原记录删除(临时保存在OLD中),再插入一条新的记录(临时保存在NEW中)。

三、触发器示例

3.1、触发自身表

1)需求描述:假设有个员工表,如果新入职人员(INSERT)的年龄小于18岁时,自动将其更新为18岁。

2)测试表创建:

DROP TABLE IF EXISTS EMP1;
CREATE TABLE `emp1` (
  `ID` int(11) DEFAULT NULL,
  `NAME` varchar(50) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL,
  KEY `ID_INDEX` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3)触发器创建:

#当年龄小于18岁时自动更新为18岁
DELIMITER $$
DROP TRIGGER IF EXISTS triEmp1ForInsert$$
CREATE TRIGGER triEmp1ForInsert BEFORE INSERT ON EMP1 FOR EACH ROW
BEGIN
    IF (NEW.AGE<18) THEN
        SET NEW.AGE=18;
    END IF;
END$$
DELIMITER ;

4)数据插入:

INSERT INTO EMP1 VALUES (1,'HELLO',17);

5)结果查询:

SELECT * FROM EMP1;

6)注意事项:

需要注意的是,MySQL触发器不允许对自身表进行更新,但是允许更新NEW。

因此,上面的需求假如想通过AFTER INSERT来更改EMP1表,是行不通的。

下面进行错误的演示:

#错误的演示
DELIMITER $$
DROP TRIGGER IF EXISTS triEmp1ForInsert$$
CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW
BEGIN
    IF (NEW.AGE<18) THEN
        UPDATE EMP1 SET AGE=18 WHERE ID=NEW.ID;
    END IF;
END$$
DELIMITER ;

3.2、触发其它表

1)需求描述:假设有两个表结构一样的表EMP1和EMP2,如果EMP1有新记录插入时而EMP2还没有,则将新记录也插入到EMP2中。

2)测试表创建:

DROP TABLE IF EXISTS EMP1;
CREATE TABLE `emp1` (
  `ID` int(11) DEFAULT NULL,
  `NAME` varchar(50) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL,
  KEY `ID_INDEX` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

DROP TABLE IF EXISTS EMP2;
CREATE TABLE `emp2` (
  `ID` int(11) DEFAULT NULL,
  `NAME` varchar(50) DEFAULT NULL,
  `AGE` int(11) DEFAULT NULL,
  KEY `ID_INDEX` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

3)触发器创建:

#EMP1插入新记录而EMP2没有时,将新记录也插入到EMP2中。
DELIMITER $$
DROP TRIGGER IF EXISTS triEmp1ForInsert$$
CREATE TRIGGER triEmp1ForInsert AFTER INSERT ON EMP1 FOR EACH ROW
BEGIN
    IF NOT EXISTS (SELECT 1 FROM EMP2 WHERE ID=NEW.ID) THEN
        INSERT INTO EMP2 (ID,`NAME`,AGE) VALUES (NEW.ID,NEW.NAME,NEW.AGE);
    END IF;
END$$
DELIMITER ;

4)数据插入:

INSERT INTO EMP1 VALUES (1,'HELLO',18);

5)结果查询:

SELECT * FROM EMP2;

四、触发器查看

#查看当前数据库所有触发器
SHOW TRIGGERS;
 
#查看指定数据库所有触发器
SHOW TRIGGERS FROM TEST;

#查看指定数据库指定表所有触发器
SELECT * FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_OBJECT_SCHEMA='TEST' AND EVENT_OBJECT_TABLE='EMP1';

五、触发器删除

#直接删除触发器
DROP TRIGGER triEmp1ForInsert;

#先检查再删除触发器
DROP TRIGGER IF EXISTS triEmp1ForInsert;

 

标签:触发器,DEFAULT,MySQL,笔记,TRIGGER,EMP1,NEW,ID
来源: https://www.cnblogs.com/atomy/p/13643177.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有