【四十二、MySql】进阶篇--触发器(介绍、语法、insert/update/delete类型)--总结(视图、存储过程、存储函数、触发器)

1,介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。

2,特性
可以协助应用在数据库端保持数据的完整性、日志记录、数据校验等操作。

3,使用事项
可使用别名old 和 new 来引用触发器中发生变化的记录内容,这与其它的数据库是相似的。在MySQL中只支持行级触发器,不支持语句级触发器。
在这里插入图片描述

4,语法
1)创建触发器

create trigger trigger_name
befor/after insert/update/delete  --after/before :指代当前触发器触发的时机是之前(before)还是之后(after) 
--insert/update/delete : 指代的时插入/修改/删除表table_name时,才会触发该触发器中trigger_stmt中的逻辑
on table_name for each row --行级触发器
begin 
	trigger_stmt; --触发器里的具体逻辑实现
end;

2)查看触发器
show triggers ;
在这里插入图片描述

3)删除触发器
drop trigger [schema_name] trigger_name; 如果没有指定 schema_name,则默认为当前数据库

4,练习
通过触发器记录employee表中的数据变更日志,将变更日志插入到emp_log表中,包含增加、修改、删除

准备工作:日志表emp_log

# 准备工作:日志表emp_log
create table if not exists `emp_log`(
        `id` int(11) not null auto_increment,
        `operation` varchar(20) not null comment '操作类型,insert/update/delete',
        `operation_date` datetime comment '操作时间',
        `operation_id` int(11) not null comment '操作的id',
        `operation_params` varchar(500) not null comment '操作参数',
        primary key(`id`)
)engine=INNODB DEFAULT CHARSET=utf8mb4;

案例1:(insert类型)
创建插入数据时的触发器

# 插入数据时的触发器
create trigger emp_insert_trigger
    after insert on employee for each row # before/after :指代当前触发器触发的时机是之前(before)还是之后(after)
                                          # insert : 指代是插入数据时的触发器
                                          # on 后面加表名 :指代的是操作的哪张表后触发该触发器
                                          # for each row : 指代行级触发器
begin
    # sql逻辑 (本例子是往日志表中插入数据)
    # new : 用old还是new?本次操作是插入数据时的触发器,对于插入数据时来说,要拿到新插入的数据,得用new来获取
    # concat() : 字符串拼接
    insert into emp_log (id,operation,operation_date,operation_id,operation_params) values
    (null,'insert',NOW(),NEW.id,concat('插入数据的内容为:【id = ',NEW.id,'】【name = ',NEW.name,'】【username = ',NEW.username,'】【password = ',NEW.password,'】……'));
end;

完成以上操作之后,查看emp_log表有无记录,OK
在这里插入图片描述

案例2:(update类型)
创建修改数据时的触发器

# 修改数据时的触发器
create trigger emp_update_trigger
    after update on employee for each row # before/after :指代当前触发器触发的时机是之前(before)还是之后(after )
                                          # update : 指代是修改数据时的触发器
                                          # on 后面加表名 :指代的是操作的哪张表后触发该触发器
                                          # for each row : 指代行级触发器
begin
    # sql逻辑 (本例子是往日志表中插入数据)
    # old & new : 在修改的操作中,old可以获取修改前的数据,new则获取将要修改或修改之后的数据
    # concat() : 字符串拼接
    insert into emp_log (id,operation,operation_date,operation_id,operation_params) values
    (null,'update',NOW(),NEW.id,concat('修改前数据的内容为:【id = ',OLD.id,'】【name = ',OLD.name,'】【username = ',OLD.username,'】【password = ',OLD.password,'】……',
      '修改后数据的内容为:【id = ',NEW.id,'】【name = ',NEW.name,'】【username = ',NEW.username,'】【password = ',NEW.password,'】……'  ));
end;

# 修改表employee中的数据,并查询表emp_log测试触发器emp_update_trigger有没有被触发,
update employee set name = '你好你好' where id = 413;

完成以上操作之后,查看emp_log表有无记录,OK
在这里插入图片描述

继续,执行如下sql,查看触发器执行多少?
update employee set name = '你好你好' where id >= 5 and id <= 10;

答案是6次,因为加了for each row行级触发器,update影响了多少行,就会触发多少次
在这里插入图片描述

案例3:(delete类型)
创建删除数据时的触发器

# 删除数据时的触发器
create trigger emp_delete_trigger
    after delete on employee for each row # before/after :指代当前触发器触发的时机是之前(before)还是之后(after )
                                          # delete : 指代是删除数据时的触发器
                                          # on 后面加表名 :指代的是操作的哪张表后触发该触发器
                                          # for each row : 指代行级触发器
begin
    # sql逻辑 (本例子是往日志表中插入数据)
    # old : 在删除的操作中,则需要用old获取删除前的数据
    # concat() : 字符串拼接
    insert into emp_log (id,operation,operation_date,operation_id,operation_params) values
    (null,'delete',NOW(),OLD.id,concat('被删除的数据内容为:【id = ',OLD.id,'】【name = ',OLD.name,'】【username = ',OLD.username,'】【password = ',OLD.password,'】……'));
end;

# 删除表employee中id为13的数据,并查询表emp_log测试触发器emp_delete_trigger有没有被触发,
delete from employee where id = 13;

完成以上操作之后,查看emp_log表有无记录,OK
在这里插入图片描述

【视图、存储过程、存储函数、触发器总结】
在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server中,触发器是一种特殊类型存储过程,它可以在数据表上发生INSERTUPDATEDELETE等事件时自动执行。下面将详细介绍如何创建INSERT触发器: 1. **触发器的创建语法** - **CREATE TRIGGER语句**:使用CREATE TRIGGER语句来创建新的触发器。这个语句的基本语法是`CREATE TRIGGER [schema_name.]trigger_name ON table_name AFTER {[INSERT],[UPDATE],[DELETE]} [NOT FOR REPLICATION] AS {sql_statements}`。 - **触发器类型**:触发器可以是后触发器(AFTER)或前触发器(INSTEAD OF)。后触发器在对应的INSERTUPDATEDELETE操作执行后触发,而前触发器则在这些操作执行之前触发。 2. **创建INSERT触发器的步骤** - **确定触发器名称和表**:首先,需要确定触发器的名称以及它要作用的表。 - **选择触发器类型**:根据需求选择创建AFTER触发器还是INSTEAD OF触发器。 - **编写触发器内容**:编写触发器要执行的SQL语句。 - **执行创建操作**:使用上述语法执行创建操作。 3. **触发器的激活条件** - **INSERT操作**:触发器可以设置为只有在INSERT操作发生时才激活。 - **UPDATE操作**:类似地,触发器也可以设置为只在UPDATE操作发生时激活。 - **DELETE操作**:同样,触发器还可以设置为只在DELETE操作发生时激活。 4. **触发器的使用场景** - **数据完整性维护**:触发器常用于维护数据的完整性,例如自动计算字段值或自动生成时间戳。 - **级联操作**:触发器可以用于实现多表之间的级联操作,如级联插入、级联删除和级联更新。 - **审计和日志记录**:触发器还可用于审计和日志记录,以便跟踪数据的变化。 5. **触发器的管理** - **查看触发器**:可以通过系统视图或系统函数查看已创建的触发器。 - **修改触发器**:如果需要更改触发器的行为,可以通过ALTER TRIGGER语句进行修改。 - **删除触发器**:当触发器不再需要时,可以使用DROP TRIGGER语句将其删除。 6. **触发器的注意事项** - **性能影响**:触发器的使用可能会对数据库性能产生影响,因此在使用时需要谨慎。 - **递归触发器**:在某些情况下,触发器可能会引起递归调用,这需要特别注意避免。 - **错误处理**:触发器中的错误处理也是非常重要的,确保在出现错误时能够适当地处理。 此外,在了解以上内容后,为了更好地理解和应用触发器,可以考虑以下几点: - 不同的数据库管理系统(如MySQL、Oracle等)在触发器的创建和使用上可能有所不同,因此需要根据实际的数据库系统进行学习和实践。 - 在设计触发器时,应该考虑到它们对数据库性能的影响,并尽可能地优化触发器中的代码。 - 在使用触发器进行数据完整性维护时,应该注意不要过度依赖触发器,而是应该通过正确的数据库设计和约束来实现数据完整性。 总的来说,触发器数据库中非常强大的一个特性,它可以帮助维护数据的完整性,实现复杂的业务逻辑,以及自动化某些数据库任务。然而,它们的使用也需要谨慎,以避免对数据库性能产生负面影响。通过合理地使用触发器,可以大大提升数据库的应用效率和数据的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值