SQL 触发器详解及代码演示

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: SQL 触发器详解及代码演示

1. 触发器的作用


触发器主要用于监视某个表的insert、update以及delete等更新操作,这些操作可以分别激活该表的insert、update或者delete类型的运行语句,从而实现数据的自动维护。


2. 创建触发器


创建一个触发器的语法如下:


create trigger [触发器名] [触发时机] [触发事件]
on [要监控的表名] for each row 
begin
  [要执行的语句]
end


触发时机包括 before和after,触发事件包括insert、update和delete,二者的组合,如before delete表示在删除前执行激活触发器,然后执行触发器中写定的代码。


例如下例代码,表示创建一个名为tri_test的触发器,它将会在prot_subscribe表执行插入操作后,执行begin…end中的代码(insert语句):


create trigger tri_test after insert on prot_subscribe for each row
begin
  insert into prot_log(mobile, id) values (new.mobile, new.product_id);
end


3. 查看触发器


3.1. show语句查看触发器


查看触发器的语法如下:


-- 查看指定数据库中的所有触发器
show triggers from [数据库名];
-- 或者,查看当前数据库中已定义的所有触发器
show triggers;


例如,要查看数据库sql_test中定义的触发器,则使用语句:


show triggers from sql_test;


返回的结果就是sql_test表中已定义的触发器的属性


3.2. information.schema表查看触发器


在MySQL系统中,在系统数据库information_ schema中存在一个存储所有触发器信息的系统表,查询该表格的记录也可以实现查看触发器功能。


例如


select * from information_schema.triggers;


返回的结果就是mysql中已定义的所有数据库


4. 删除触发器


删除触发器使用drop trigger语句,语法如下:


drop trigger [if exists] [触发器名]


例如,下面代码表示,如果在sqltest数据库中存在tri_sub_one触发器,则删除它:


drop trigger if exists sqltest.tri_sub_one;


5. 使用限制


1、一个表上只能有一个相同类型的触发器,因此在一个表上最多只能建立6个触发器,分别是:


before insert、after insert
before update、after update
before delete、after delete


2、new表示触发器的所在表中,激活了触发器的那一行数据。

具体地,在insert型触发器中,new关键字用来表示将要(before)或已经(after)插入的新数据;在UPDATE型触发器中,old关键字用来表示将要或已经被修改的原数据,new用来表示将要或已经修改为的新数据;在delete型触发器中,old用来表示将要或已经被删除的原数据;


使用方法: new.[字段名]。另外,old是只读的,而new则可以在触发器中使用set语句进行赋值,这样不会再次触发触发器,造成循环调用。


3、对于mysql而言,一般情况下,默认是以分好" ; "作为结束执行语句,这导致在触发器的begin…end语句中有多行代码时,与触发器中需要的分行起冲突,为解决此问题,mysql提供了delimiter关键字,如:

" delimiter || “,表示在下面的代码段中,将结束符号变成||。当触发器创建完成后,可以用” delimiter ; “来将结束符号变回分号” ; "


-- 用$$符号来表示语句结束
delimiter $$ 
drop trigger if exists `updateegopriceondelete`$$ 
create 
    trigger `updateegopriceondelete` after  delete on  `customerinfo` 
    for each row begin 
delete from egoprice  where customerid=old.customerid; 
    end $$ -- 语句结束
delimiter ;  -- 将结束符号由$$ 变回分号;


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
拿php写个原生增删改查案例出来(提供全部代码+sql)
|
2月前
|
SQL 存储 安全
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
第七章 SQL错误信息 - SQL错误代码 -400 到 -500
39 1
|
2月前
|
SQL 数据库连接 索引
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
第四章 SQL错误信息 - SQL错误代码 -1 到 -99
33 0
|
5天前
|
SQL 分布式计算 DataWorks
DataWorks操作报错合集之在执行SQL查询时遇到报错,代码为[XX000],该怎么解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
15天前
|
SQL 人工智能 自然语言处理
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
一款利用人工智能将自然语言查询转换为 SQL 代码的互译工具 - SQL Translator
|
1月前
|
SQL 机器学习/深度学习 分布式计算
MaxCompute产品使用合集之sql代码中支持插入jinja语法语句吗
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
1月前
|
存储 SQL 数据库
SQL 语言:存储过程和触发器
SQL 语言:存储过程和触发器
43 6
|
20天前
|
Java jenkins 持续交付
Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试
【7月更文挑战第1天】Jenkins是开源CI/CD工具,用于自动化Java项目构建、测试和部署。通过配置源码管理、构建触发器、执行Maven目标,实现代码提交即触发构建和测试。成功后,Jenkins执行部署任务,发布到服务器或云环境。使用Jenkins能提升效率,保证软件质量,加速上线,并需维护其稳定运行。
56 0
|
1月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错合集之在本地执行代码没有问题,但是在线执行sql命令就会报错,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
103 0
|
2月前
|
SQL 存储 数据库
第六章 SQL错误信息 - SQL错误代码 -200 到 -399
第六章 SQL错误信息 - SQL错误代码 -200 到 -399
17 1