您的位置:首页 > 数据库 > MySQL

mybatis框架下mysql多表更新的操作

2015-03-26 14:00 731 查看
我在mybatis框架下对mysql进行操作遇到一个问题:我希望对多张结构相同的表进行更新,而且只是更新其中 ctr_cp 属性的值,但是我采用下面的语句时报错

update (select * from a_reviews union all select * from b_reviews) as test set ctr_cp=true
我之所以这么写,是因为查表是可以的:

select * from (select * from a_reviews union all select * from b_reviews) as test
于是我就去搜了搜,发现其实多表更新并不用这么麻烦,但是网上给出的都是多表联合更新的情况:

update a_reviews,b_reviews set a_reviews.ctr_cp=true, b_reviews.ctr_cp=1 where ...



要注意的是,我的表格式都相同,这么写有些繁琐,一来是where一定要写条件,而来这种语句多用于两个表联合查询,需要增加两个表的连接条件。于是后来我用了数据库的过程调用,这样子可以比较方便的对多个表进行操作,具体如下:

使用常规的创建存储过程方法,会发现各种报错。在SQL SERVER下可以成功的写法,在MySQL下可能不行,原因是MySQL中需要设置DELIMITER。

因为在procedure中经常要用到默认的命令结束符--分号" ; " ,所以在创建procedure的时候需要定义新的结束符以说明创建procedure的命令结束,-这里将结束符号改成美元符号$。

1、先在mysql中创建过程:

delimiter $
create procedure update_test()
begin
update a_reviews set ctr_cp=true;
update b_reviews set ctr_cp=true;
...
end
$


注意,在update_test后面有个(),是因为没有要传入的参数。如果需要传递参数作为判断条件或者赋值,可像下面的代码(网上找):

create procedure p3(IN nameid int, OUT person_name varchar(10))
begin
select * from test.zzm;
select zzm.name into person_name from test.zzm where zzm.id = nameid;
end



--此存储过程的过程名是p3,该过程包含两个参数,--一个是输入类型的(以IN标示),参数名是nameid,类型是int,--一个是输出类型的(以OUT标示),参数名是person_name,类型是varchar(10)--此存储过程的作用是查询出zzm表的全部内容,会输出结果集(data set),然后--再查询表中记录的ID是nameid的字段name,将其输出到第二个输出类型的参数里面,这个查询--不会输出结果集。

(参考:http://database.51cto.com/art/201010/229242.htm)

2、在xml文件中:

<update id="update_test" statementType="CALLABLE">
call update_test()
<update>


这样就可以实现多表更新了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mybatis mysql jdbc 数据库