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

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

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触发器语法的一个实例的更多相关文章

  1. mysql 触发器语法详解

    1.创建Mysql触发器: 语法: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BE ...

  2. MySql触发器语法总结

    经过昨天多次失败,今天终于将我要实现的触发器功能写成功了,触发器代码如下: -- use dbfortest; drop trigger if exists tg_before_insert_on_d ...

  3. mysql增量恢复的一个实例操作

    通过防火墙禁止web等应用向主库写数据或者锁表,让主库暂时停止更新,然后进行恢复 模拟整个场景 1.登录数据库 [root@promote 3306]# mysql -uroot -S /data/3 ...

  4. mysql触发器的作用及语法

    触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...

  5. [转]mysql触发器的作用及语法

    转自:http://blog.csdn.net/cloudday/article/details/6905590 触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本 ...

  6. PHP 2:从一个实例介绍学习方法

    原文:PHP 2:从一个实例介绍学习方法 在前面我已经描述了PHP,Apache以及MySQL的安装与配置.下面将介绍一下我如何学习PHP.首先我自己已经有了一些编程经验,就拿我自己而言,已经熟悉C/ ...

  7. mysql触发器使用方法具体解释

    MySQL触发器语法具体解释: 触发器 trigger是一种特殊的存储过程.他在插入(inset).删除(delete)或改动(update)特定表中的数据时触发运行,它比数据本身标准的功能更精细和更 ...

  8. mysql触发器trigger 实例详解

    mysql触发器trigger 实例详解 (转自 https://www.cnblogs.com/phpper/p/7587031.html)   MySQL好像从5.0.2版本就开始支持触发器的功能 ...

  9. mysql 触发器(Trigger)简明总结和使用实例

    一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(tr ...

随机推荐

  1. HDU——T 2594 Simpsons’ Hidden Talents

    http://acm.hdu.edu.cn/showproblem.php?pid=2594 Time Limit: 2000/1000 MS (Java/Others)    Memory Limi ...

  2. eclipse - 下载网址

    这里面有着非常齐全的eclipse相关资源,而且都是放在网盘里面的,下载也方便 http://www.androiddevtools.cn/

  3. 1.18 Python基础知识 - Python内置函数

    官方地址:https://docs.python.org/3.5/library/functions.html abs(x): 返回数字的绝对值 all(iterable): 如果迭代器的所有元素都为 ...

  4. VNC Server模拟攻击实战

    VNC目前已被广泛应用的一个远程控制程序,很多攻击者对VNC的攻击技术研究热情是高涨的,丝毫不亚于对Windows的远程桌面(3389).PcAnywhere的攻击研究.从最开始爆发出来的VNC的低版 ...

  5. Express简介、安装

    Express 基于Node.js平台,快速.开放.极简的web开发框架,是目前最流行的基于Node.js的web开发框架,它提供一系列强大的功能,比如: 路由控制 参数获取 send和sendFil ...

  6. 洛谷 P2655 2038年问题

    P2655 2038年问题 题目描述 网络时代,机会与危机共存.“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡. 也许大家都已经知道计算机的2000年问题是什 ...

  7. 40.【IntelliJ IDEA】使用idea解决新建jsp文件而找不到jsp文件模版的新建选项

    转自:https://www.cnblogs.com/sxdcgaq8080/p/7676294.html 使用idea解决新建jsp文件而找不到jsp文件模版的新建选项,这样每次创建一个新的jsp文 ...

  8. Java 学习(17): Java 泛型

    Java 泛型 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型. 泛型的本质是参数化类型,也就是说将 ...

  9. 洛谷 P1808 单词分类_NOI导刊2011提高(01)

    P1808 单词分类_NOI导刊2011提高(01) 题目描述 Oliver为了学好英语决定苦背单词,但很快他发现要直接记住杂乱无章的单词非常困难,他决定对单词进行分类. 两个单词可以分为一类当且仅当 ...

  10. 今天遇到奇怪的事:SVN本地代码的标记突然没了,Clean up也报错

    今天遇到奇怪的事:SVN本地代码的标记突然没了.Clean up也报错 脑子一想这样的情况,能够先把原来的文件夹改一个名字.又一次把代码check out下来,再合并提交更新,但这样也太LOW了吧 上 ...