我要实现的功能是:在更新一个表时。从三个表中查询记录并插入到另外一个表中。以下是我写触发器的过程:

第一次写的触发器例如以下:

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、定义变量时用了@符号,以下引用时也要用上@符号

最新文章

  1. git pull提示当前不在某个分支上
  2. Android 采用Layout Inflater创建一个View对象
  3. love your life
  4. Redis 安全性设置
  5. zepto.js + iscroll.js上拉加载 下拉加载的 移动端 新闻列表页面
  6. python基础:day3作业
  7. ffmpeg 打开视频流太慢(上)
  8. 第三十二篇、iOS 10开发
  9. angularjs手动解析表达式($parse)
  10. SMTP命令 发送邮件 DOS命令
  11. 初识Windous程序
  12. NOIP2017-普及组复赛第2题 题解
  13. Bitmap上下合成图片
  14. Symbol特殊用途
  15. 用EditPlus和jdk写Java代码
  16. js让元素获取焦点
  17. java基础 (二)之HashMap,HashTable,ConcurrentHashMap区别
  18. mongoose入门
  19. PyCharm/IDEA 使用技巧总结
  20. OI,再见

热门文章

  1. shell项目-分发系统-expect讲解
  2. area热点区域
  3. View_01_LayoutInflater的原理、使用方法
  4. UICollectionView 集合视图 的使用
  5. Windows简单入门-送给第一次使用电脑的朋友
  6. JS ajax 应用 (下拉列表联动)
  7. mysql 压力测试之批量插入自增字段不连续问题
  8. JS 实现图片模态框,幻灯片,跑马灯功能
  9. [Vue + TS] Create Type-Safe Vue Directives in TypeScript
  10. hysbz 2243 染色(树链剖分)