标准SQL和MYSQL触发器的差异

        触发器 (trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。在定义触发器后一旦进行增、删、改操作时都会由服务器自动激活相应的触发器。简单来说触发器就是和JAVA中的监听器功能相似。

一、触发器的定义

        在上课过程中,很多老师只讲了标准SQL语句中的触发器,许多课本也仅仅提供了标准SQL语句下触发器的定义,而触发器在SQL99才写入SQL标准,MYSQL在此之前已经支持触发器,所以其有一套自己的触发器语法。

         标准SQL下触发器的定义

CREATE TRIGGER  <触发器名> 

{ BEFORE | AFTER } <触发事件> ON <表名> 

FOR EACH { ROW | STATEMENT }

[ WHEN <触发条件> ]

<触发动作体>


1.触发器名:即为触发器的名称

2.触发事件:INSERT/DELETE/UPDATE及这些操作的组合

3.表名:触发器的目标表

4.触发条件:只有触发条件为真,才执行动作体

5.触发动作体:即要执行的功能


BRFORE|AFTER 即在完成事件之前还是之后激活触发器。

FOR EACH ROW|STATEMENT 定义触发器类型为行级(ROW)还是语句级(STATEMENT)

行级触发器则只要修改某一行,即会激活触发器。

语句级触发器则只有一条SQL语句执行完毕才会激活触发器。

        MYSQL下触发器的定义 

CREATE TRIGGER  <触发器名> 

{ BEFORE | AFTER } <触发事件> ON <表名> 

FOR EACH ROW

[ WHEN <触发条件> ]

<触发动作体>


MYSQL下触发器的定义取消了触发器的类型,使得所有触发器都只能为行级触发器。

二、 保存临时变量的容器

        在很多教科书中,这一部分都统称为临时表。存放的是对表中修改行的信息,触发器自动创建自动删除。
        标准SQL下临时表

INSERTEDDELETED
INSERT×
DELETE×
UPDATE

举个例子

在STUDENT表中定义一个触发器,使得当该学生为计算机系学生时将该学生信息自动写入CS_STUDENT表

CREATE TRIGGER InsertStudentTrigger
AFTER insert ON student
FOR EACH STATEMENT 
AS BEGIN
 Insert into CS_Student
 Select * from inserted where sdept = ‘CS’;
END;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行过程如下:

起始状态的STUDENT,CS_STUSENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS

执行上述插入语句时,先影响STUDENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS
202002张三CS

激活触发器,系统自动生成一个INSERTED表

INSERTED
SNOSNAMEDEPTNAME
202002张三CS

之后将INSERTED表中数据放入CS_STUDENT表中

CS_STUDENT
SNOSNAMEDEPTNAME
202002张三CS

系统自动删除INSERTED表。

         MYSQL下的临时数据存放器

        在MYSQL中,由于触发器只有行级类型触发器,如果把其看作一张表,则是一张只有一行数据的表格,所以MYSQL中取消了临时数据表,改成了一个类似JAVA中保存临时数据的对象。名字为NEW和OLD,因为他们不是表,故无法在SELECT语句中引用。

还是刚才那个例子

CREATE TRIGGER InsertStudentTrigger
AFTER insert ON student
FOR EACH ROW
 Insert into CS_Student
 Select * from NEW where sdept = ‘CS’;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行后会报不存在NEW表的异常,正确的方法如下:

CREATE TRIGGER CSP
BEFORE INSERT ON STUDENT
FOR EACH ROW
BEGIN
	IF NEW.DEPTNAME = 'CS'
	THEN INSERT INTO STUDENTCS
				VALUES(NEW.SNO,NEW.SNAME,NEW.DEPTNAME);
	END IF;
END;

INSERT INTO STUDENT(SNO,SNAME,DEPTNAME)
VALUES('202002','张三','CS');

执行过程是这样的:

执行上述插入语句时,先影响STUDENT表

STUDENT
SNOSNAMEDEPTNAME
202001李四IS
202002张三CS

激活触发器,系统自动生成一个NEW对象(拿JAVA中的类举例)

class NEW{

        SNO = '202002';

        SNAME = '张三';

        DEPTNAME = 'CS';

}

把这个对象中的数据插入CS_STUDENT表中

CS_STUDENT
SNOSNAMEDEPTNAME
202002张三CS

删除生成的NEW对象。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL创建触发器可以使用CREATE TRIGGER语句。触发器可以在插入、更新或删除数据时自动执行一些操作。下面是创建触发器的步骤: 1. 使用SHOW CREATE TRIGGER trigger_name;命令显示已存在的触发器创建语句。 2. 创建触发器需要指定触发器的名称,触发时机(BEFORE或AFTER),触发操作(INSERT、UPDATE或DELETE),以及触发的表名。 3. 在触发器的定义中,可以使用NEW关键字来引用插入或更新后的新记录,使用OLD关键字来引用更新或删除前的旧记录。 4. 触发器可以包含各种SQL语句,如INSERT、UPDATE、DELETE等,用于实现所需的功能。 5. 完成触发器的定义后,使用DELIMITER语句设置新的定界符(如$$),然后执行CREATE TRIGGER语句来创建触发器。 下面是一个创建插入触发器的示例: CREATE TRIGGER trigger_insert AFTER INSERT ON student FOR EACH ROW BEGIN -- 触发器的操作语句 INSERT INTO log_table (operation, detail) VALUES ('INSERT', CONCAT('Inserted record: ', NEW.name, ', ', NEW.gender, ', ', NEW.age)); END$$ 在这个示例中,当向student表插入一条记录时,触发器会将操作类型设置为INSERT,并将插入的新纪录的内容保存到log_table表中。 需要注意的是,触发器的具体实现方式可能因不同的MySQL版本或配置而有所差异,因此在创建触发器时,建议参考MySQL官方文档或相关文档进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [创建mysql触发器](https://blog.csdn.net/nasid/article/details/124801429)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值