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

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

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. php开启openssl扩展

    windows下开启方法: 1: 首先检查php.ini中:extension=php_openssl.dll是否存在, 如果存在的话去掉前面的注释符‘:’, 如果不存在这行,那么添加extensio ...

  2. Linux 交换分区swap

    Linux 交换分区swap 一.创建和启用swap交换区 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存 ...

  3. Flask的快速入门详细笔记

    Flask的框架结构对应关系及理解 1.简介 简单介绍下Flask是一个轻量级的web前端框架,不像django那样本身具备一套完整的页面体系,轻量级说明了完全可以自定义,从功能逻辑到业务处理,都可以 ...

  4. RLF。HRLF解释

  5. 如何优雅的写UI——(6)内存泄漏

    控件讲了这么久,其实我的程序有两个Bug不知道大家有没有发现,这两个Bug都不会报错,对程序运行来说都没有阻碍,但是这种Bug对整个代码来说是一个很大的安全隐患. 什么是内存泄漏 内存泄漏(Memor ...

  6. 【Hello 2018 D】Too Easy Problems

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 可以考虑把所有的题目按照ai排序. 然后顺序考虑最后做出来的题目个数和第i道题目的ai一样. 则1..i-1这些题目就没有用了. 值 ...

  7. 【剑指Offer学习】【面试题49:把字符串转换成整数】

    题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能.不能使用atoi或者其它相似的库函数. 题目解析 这看起来是非常easy的题目,实现基本功能 ,大部分人都能用10行之内的代码 ...

  8. CMake设置生成vs工程的动态库输出路径

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在网上搜了很多的资料,发现CMake不能设置一个动态库工程的输出目录和中间目录,难道除了VC之外其它编译器如gcc中没 ...

  9. golang pipe

    ===============golang pipe============== package main import ( "fmt" "io" ) func ...

  10. canvas.toDataURL() gives “Security Error” in IE 11

    http://stackoverflow.com/questions/30101143/canvas-todataurl-gives-security-error-in-ie-11