mysql触发器语法的一个实例
我要实现的功能是:在更新一个表时。从三个表中查询记录并插入到另外一个表中。以下是我写触发器的过程:
第一次写的触发器例如以下:
CREATE TRIGGER istmingxi
AFTER UPDATE ON sys_shenbao FOR EACH ROW BEGIN
SELECT @kid:=jl.kid,@gonghao:=shen.gonghao,@vuid:=jl.vuid,@zhibiao:=ct.leibie,
@citiao:=ct.bianhao,@fenshu:=ct.fenshu,@bumen:=zl.bumen,@ctime:=shen.verifytime
FROM sys_shenbao shen
INNER JOIN sys_shenbjl jl ON jl.d = shen.sid
INNER JOIN sys_citiao ct ON ct.bianhao = shen.ctbh
INNER JOIN sys_jibzl zl ON zl.gonghao = shen.gonghao
WHERE shen.sid = new.sid;
if fenshu > 0 then
set @jiafen = fenshu;
set @jianfen = 0;
else
set @jiafen = 0;
set @jianfen = fenshu;
end if;
INSERT INTO sys_mingxi(`kid`,`gonghao`,`vuid`,`zhibiao`,`bumen`,`jiafen`,`jianfen`,`yue`,`ctime`)
VALUES(kid,gonghao,vuid,zhibiao,citiao,bumen,jiafen,jianfen,0,ctime);
END;
生成上面触发器时报错:Not allowed to return a result set from a trigger;原因是trigger
中不同意返回select出来的结果集。所以 “select @kid:=jl.kid....”部分改变成还有一种写法,例如以下
CREATE TRIGGER istmingxi
AFTER UPDATE ON sys_shenbao FOR EACH ROW BEGIN
SELECT jl.skid into @kid, shen.gonghao into @gonghao,jl.vuid into @vuid,ct.leibie into @zhibiao,
ct.bianhao into @citiao,ct.fenshu into @fenshu,zl.bumen into @bumen,shen.verifytime into @ctime
FROM sys_shenbao shen
INNER JOIN sys_shenbjl jl ON jl.id = shen.sid
INNER JOIN sys_citiao ct ON ct.bianhao = shen.ctbh
INNER JOIN sys_jibzl zl ON zl.gonghao = shen.gonghao
WHERE shen.sid = new.sid;
if fenshu > 0 then
set @jiafen = fenshu;
set @jianfen = 0;
else
set @jiafen = 0;
set @jianfen = fenshu;
end if;
INSERT INTO sys_mingxi(`kid`,`gonghao`,`vuid`,`zhibiao`,`bumen`,`jiafen`,`jianfen`,`yue`,`ctime`)
VALUES(kid,gonghao,vuid,zhibiao,citiao,bumen,jiafen,jianfen,0,ctime);
END;
此时还是会报错:SQL 错误 [1327] [42000]: Undeclared variable: shen; Undeclared variable: shen;原因是“select jl.skic into @kid...”部分的select语句的语法还是不正确。
原因是:欲想通过一个SELECT语句对多个变量赋值。请採用下面语句形式:SELECT
id,name INTO @v1,@v2 FROM ...
所以终于我改成了例如以下的方式:
CREATE TRIGGER istmingxi
AFTER UPDATE ON sys_shenbao FOR EACH ROW BEGIN
SELECT jl.skid,shen.gonghao,jl.vuid,ct.leibie,ct.bianhao,ct.fenshu,zl.bumen,shen.verifytime
INTO @kid,@gonghao,@vuid,@zhibiao,@citiao,@fenshu,@bumen,@ctime
FROM sys_shenbao shen
INNER JOIN sys_shenbjl jl ON jl.id = shen.sid
INNER JOIN sys_citiao ct ON ct.bianhao = shen.ctbh
INNER JOIN sys_jibzl zl ON zl.gonghao = shen.gonghao
WHERE shen.sid = new.sid;
if fenshu > 0 then
set @jiafen = fenshu;
set @jianfen = 0;
else
set @jiafen = 0;
set @jianfen = fenshu;
end if;
INSERT INTO sys_mingxi(`kid`,`gonghao`,`vuid`,`zhibiao`,`bumen`,`jiafen`,`jianfen`,`yue`,`ctime`)
VALUES(kid,gonghao,vuid,zhibiao,citiao,bumen,jiafen,jianfen,0,ctime);
END;
到这执行的时候还是会报错:ERROR 1172 (42000): Result consisted of more than one row。
这个报错的原因是select into返回了多行记录,这在给变量赋值的时候是不同意的,后来检查是where条件的问题;
改动了where条件后返回一条记录这个问题攻克了。
再次执行时又报错:SQL 错误 [1054] [42S22]: Unknown column 'fenshu' in 'field list' ;这个错误的原因是以下在引用变量“fenshu”时语法错误;
上面定义变量时用了@符号,以下引用时也要用上@符号。
最后触发器改成例如以下:
AFTER UPDATE ON sys_shenbao FOR EACH ROW BEGIN
if new.verifystatus = 2 then
SELECT jl.skid,shen.gonghao,jl.vuid,ct.leibie,ct.bianhao,ct.fenshu,zl.bumen,shen.verifytime
INTO @kid,@gonghao,@vuid,@zhibiao,@citiao,@fenshu,@bumen,@ctime
FROM sys_shenbao shen
INNER JOIN sys_shenbjl jl ON jl.id = shen.sid
INNER JOIN sys_citiao ct ON ct.bianhao = shen.citbh
INNER JOIN sys_jibzl zl ON zl.gonghao = shen.gonghao
WHERE shen.id = new.id;
if @fenshu > 0 then
set @jiafen = @fenshu;
set @jianfen = 0;
else
set @jiafen = 0;
set @jianfen = @fenshu;
end if;
INSERT INTO sys_mingxi(`kid`,`gonghao`,`vuid`,`zhibiao`,`citiao`,`bumen`,`jiafen`,`jianfen`,`yue`,`ctime`)
VALUES(@kid,@gonghao,@vuid,@zhibiao,@citiao,@bumen,@jiafen,@jianfen,0,@ctime);
end if;
END;
到这触发器成功了。
最后总结例如以下:
1、trigger 中不同意返回select出来的结果集
2、欲想通过一个SELECT语句对多个变量赋值。请採用下面语句形式:SELECT id,name INTO @v1,@v2 FROM ...
3、select
into给变量赋值的语法不同意返回多行
4、定义变量时用了@符号,以下引用时也要用上@符号
mysql触发器语法的一个实例的更多相关文章
- mysql 触发器语法详解
1.创建Mysql触发器: 语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BE ...
- MySql触发器语法总结
经过昨天多次失败,今天终于将我要实现的触发器功能写成功了,触发器代码如下: -- use dbfortest; drop trigger if exists tg_before_insert_on_d ...
- mysql增量恢复的一个实例操作
通过防火墙禁止web等应用向主库写数据或者锁表,让主库暂时停止更新,然后进行恢复 模拟整个场景 1.登录数据库 [root@promote 3306]# mysql -uroot -S /data/3 ...
- mysql触发器的作用及语法
触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...
- [转]mysql触发器的作用及语法
转自:http://blog.csdn.net/cloudday/article/details/6905590 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本 ...
- PHP 2:从一个实例介绍学习方法
原文:PHP 2:从一个实例介绍学习方法 在前面我已经描述了PHP,Apache以及MySQL的安装与配置.下面将介绍一下我如何学习PHP.首先我自己已经有了一些编程经验,就拿我自己而言,已经熟悉C/ ...
- mysql触发器使用方法具体解释
MySQL触发器语法具体解释: 触发器 trigger是一种特殊的存储过程.他在插入(inset).删除(delete)或改动(update)特定表中的数据时触发运行,它比数据本身标准的功能更精细和更 ...
- mysql触发器trigger 实例详解
mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html) MySQL好像从5.0.2版本就开始支持触发器的功能 ...
- mysql 触发器(Trigger)简明总结和使用实例
一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(tr ...
随机推荐
- Python day3 知识回顾
names = ["Jonathen","Joesph","Jotaro","Josuke",["Mea&qu ...
- 00082_Set接口
1.Set接口介绍 (1)Collection中可以存放重复元素,也可以不存放重复元素,那么我们知道List中是可以存放重复元素的.那么不重复元素给哪里存放呢?那就是Set接口,它里面的集合,所存储的 ...
- wpf app全局变量传参方法(代码片段 )
清空某行绑定的行数据: int RowIndex = datagrid.SelectedIndex; _Table.Rows[RowIndex]["AVERAGE_PRICE"] ...
- 使用maven的tomcat:run进行web项目热部署
近期又又一次看了一下maven的东西,事实上主要是由于去了解Jenkins,后期或许会补充jenkins的博文. 怎么在eclipse里面创建maven webproject,这边就不介绍了,參见:h ...
- Summary Day32
1 . 文件管理 1.1 标C文件处理和UC文件处理函数的比較: 标C文件处理函数比UC的文件处理函数速度快.由于标C内部独立输入输出缓冲区, 会积累一定数量之后再写入文件,因此读写效率比較高 使用t ...
- [React] Compound Component (React.Children.map & React.cloneElement)
Imaging you are building a Tabs component. If looks like: <Tabs> <TabList> <Tab> o ...
- Android使用BroadCastRecevier广播实现接收短信,并利用Toast弹出显示内容
在上一篇文章 Android简单实现BroadCastReceiver广播机制 中简单的实现了一个广播机制,这里利用BroadCarstRecevier实现一个接收短信并显示内容的案例,当然至于接收到 ...
- android图像处理系列之五--给图片添加边框(中)
前面一篇讲到给图片加边框的方式,只能给图片加一些有规则的边框,如果想加一些比较精美的效果,就有点麻烦了.下面就给出解决这个问题的思路. 思路是:一些比较精美的花边图片我们是很难用代码控制,就目前本人水 ...
- 妙味css3课程---1-2、css3中新增的伪类和伪元素有哪些
妙味css3课程---1-2.css3中新增的伪类和伪元素有哪些 一.总结 一句话总结: 1.div:target{}是什么意思? 比如a标签的锚点链接到div,div:target{}就可以找到这个 ...
- UVA 11488 Hyper Prefix Sets (字典树)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...