第一次写触发器。
实现的功能:
插入机构(bzsh_jg)的时候同步插入一条数据到control_unit表中。
先要根据隶属机构号(字段lsjgh)去查询父机构的数据,然后在插入的时候放入control_unit表的parentid这个字段。
代码如下:
delimiter $
create trigger bzsj_jg_insert
after insert on bzsh_jg
for each row
begin
declare indexcode varchar(64);
declare controlunitname varchar(64);
declare parentid int;
declare unitlevel int;
declare paranetUnitLevel int;
declare strrev1 varchar(64);
set indexcode = new.jgh;
set controlunitname = new.jgmc;
set strrev1 = new.lsjgh;
if new.lsjgh is null then
set parentid = 0;
set unitlevel = 0;
else
select control_unit_id, unit_level into parentid, paranetUnitLevel from control_unit where index_code = new.lsjgh;
set unitlevel = paranetUnitLevel + 1;
end if;
insert into control_unit ( index_code, name, parent_id,unit_level,use_stream_sv,sequence_idx,operator_id, create_time,update_time,str_rev_1)
values ( indexcode, controlunitname,parentid,unitlevel, false,0,0,now(),now(),strrev1);
end$
测试的时候,parentid总是为空,把26行最后的new.lsjgh换成正常的数值就没问题了,比如:
select control_unit_id, unit_level into parentid, paranetUnitLevel from control_unit where index_code = '123';
开始以为是select into 语句中不能传入 new的参数,调试好久才发现是字段长度的问题, control_unit 表的 index_code 长度 和 bzsh_jg 表中的 lsjgh 长度不一样,虽然都是varchar
index_code 是 varchar(64),lsjgh只有 varchar(20) ,插入bzsh_jg的时候lsjgh字段被自动截取为20个字符了,所以查到的结果为空。
结论:插入bzsh_jg表的时候lsjgh的长度被自动截取了,所以导致查出的数据为空.当字段类型不一致的情况,比如一个是int一个是varchar,也会出现这种情况。
顺便吐槽一下第三方公司的表命名和字段命名,全是拼音缩写,看的我蛋都碎了,太扯了。