1. 程式人生 > >mysql觸發器語法的一個實例

mysql觸發器語法的一個實例

執行 int unknown value height time declare new set

我要實現的功能是:在更新一個表時。從三個表中查詢記錄並插入到另外一個表中。以下是我寫觸發器的過程:

第一次寫的觸發器例如以下:

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”時語法錯誤;

[email protected],[email protected]

最後觸發器改成例如以下:

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、[email protected],[email protected]



mysql觸發器語法的一個實例