mysql触发器语法的一个实例
2017-07-13 21:43
309 查看
我要实现的功能是:在更新一个表时。从三个表中查询记录并插入到另外一个表中。以下是我写触发器的过程:
第一次写的触发器例如以下:
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、定义变量时用了@符号,以下引用时也要用上@符号
第一次写的触发器例如以下:
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、定义变量时用了@符号,以下引用时也要用上@符号
相关文章推荐
- css教程之样式表的基本语法(二) class(类)和id的一个小实例
- mysql触发器语法的一个实例
- mysql触发器语法及实例
- PHP基本语法实例总结
- 只启动一个程序实例,如果已运行则调到前端
- 温度表刻度的读取(一个图像处理实例)来自csdn“iamsheldon”博客
- freemarker语法介绍及其入门教程实例
- 给easyui datebox扩展一个清空的实例,借鉴http://www.cnblogs.com/baiyangyuanzi/p/6625377.html
- 自己写一个编译器:第二天:规范语法
- simple-spa 一个简单的单页应用实例
- python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的
- 程序只运行一个实例,并激活已运行的程序
- 一个数据库实例在启动时报ORA-27140
- 一个简单的Draw2d动画实例
- 一个alert对话框实例
- 一个linux内核编译时遇到的perl语法导致的编译问题解决
- 【转】一个简单的Ajax请求实例
- hybrid的一个实例应用分析
- 72 题目:设计一个类,我们只能生成该类的一个实例
- 在看官方的例子时候由一个grid实例,在每一行之前有个加号,展开可以显示内容,在实际应用中还是非常有用的,照搬例子的代码,发现老是提示对象不存在,查阅资料后发现是没有加载插件,这里和大家分享下Ext.grid.RowExpander插件的使用,