SQL如何实现存在即更新,没有就插入

bedonga java软件工程师  2015-07-23 10:50:59
以前一直在用mysql,由于项目原因需要用SQL SERVER,今天遇到个问题就是SQL如何实现存在即更新,没有就插入。

我用mybatis写的:意思是就是判断category和position同时存在才更新,只有一个或都不存在就插入。但是我写的结果却是只要(category和positionID)其中一个存在,就把数据库中的所有有关的给跟新了,请问各位大侠有什么好的解决办法吗?

if exists (select * from T_Mobilie_BackstageCommon where category=#{category,jdbcType=VARCHAR} and positionId=#{positionId,jdbcType=INTEGER})
begin
update T_Mobilie_BackstageCommon set category=#{category,jdbcType=VARCHAR},pathStr=#{pathStr,jdbcType=VARCHAR},jumpToUrl=#{jumpToUrl,jdbcType=VARCHAR},title=#{title,jdbcType=VARCHAR},memo=#{memo,jdbcType=VARCHAR},expansion_one=#{expansion_one,jdbcType=VARCHAR},expansion_two=#{expansion_two,jdbcType=VARCHAR}
end
else
begin
insert into T_Mobilie_BackstageCommon(category, pathStr, jumpToUrl, title, needToLogin, positionId,memo, expansion_one, expansion_two)
values(#{category,jdbcType=VARCHAR}, #{pathStr,jdbcType=VARCHAR}, #{jumpToUrl,jdbcType=VARCHAR}, #{title,jdbcType=VARCHAR}, #{needToLogin,jdbcType=INTEGER}, #{positionId,jdbcType=INTEGER}, #{memo,jdbcType=VARCHAR}, #{expansion_one,jdbcType=VARCHAR}, #{expansion_two,jdbcType=VARCHAR})
end
...全文
11495 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Demo2333 2018-03-19
mybatis + mysql 我是这样处理的
引用

<insert id="saveOrUpdate" parameterType="com.entity.BdipWorkflowDetail">
	  <selectKey keyProperty="exField1" resultType="string" order="BEFORE">
	    select count(*) from bdip_workflow_detail where id_ = #{id}
	  </selectKey>
	  <if test="exField1 != 0">
	    update bdip_workflow_detail_workflow_detail
	    set model_id = #{modelId},xmmc=#{xmmc},cc_by = #{ccBy},cc_bys = #{ccBys},cc_name = #{ccName},cc_names = #{ccNames},status_ = #{status},receive_by = #{receiveBy},
	    receive_name = #{receiveName},create_name = #{createName},ex_field1 = #{exField1},
	    ex_field2 = #{exField2},ex_field3 = #{exField3},ex_field4 = #{exField4},
	    create_by = #{createBy},update_time = #{updateTime},enable_ = #{enable},vpids = #{vpids}
	    where id_ = #{id}
	  </if>
	  <if test="exField1==0">
	    insert into bdip_workflow_detail
	    (id_,model_id,xmmc,cc_by,cc_bys,cc_name,cc_names,status_,receive_by,receive_name,
	    create_name,ex_field1,ex_field2,
	    ex_field3,ex_field4,create_by,create_time,enable_,vpids)
	    values(#{id},#{modelId},#{xmmc},#{ccBy},#{ccBys},#{ccName},#{ccNames},#{status},#{receiveBy},
		#{receiveName},#{createName},#{exField1},
		#{exField2},#{exField3},#{exField4},#{createBy},#{createTime},#{enable},#{vpids})
	  </if>
	</insert>
mybatis+sqlserver 还不知道怎么搞
回复
引用 5 楼 Bdongo 的回复:
没有大神吗?
废人
回复
许晨旭 2015-07-23
@category,@positionId这只是个变量,你可以写成表;写成这样你还不能完成,就算再牛的大神也帮不了你
回复
道玄希言 2015-07-23
MSSQL里面的变量, 都必需用 declare 声明. @category 是变量. 你自己的字段是 category, positionId . 你需要在语句最前面加上 declare @category nvarchar(20), @positionId nvarchar(20)
回复
bedonga 2015-07-23
没有大神吗?
回复
bedonga 2015-07-23
引用 3 楼 Landa_Ran 的回复:
merge into T_Mobilie_BackstageCommon a
using (select @category,@positionId) as b(category,positionId) on a.category=b.category and a.positionId=b.positionId
when matched then
	update set   --更新字段
when not matched then
	insert(category, pathStr, jumpToUrl, title, needToLogin, positionId,memo, expansion_one, expansion_two)values
	(category, pathStr, jumpToUrl, title, needToLogin, positionId,memo, expansion_one, expansion_two);
	--插入数据
@category,@positionId这个两个东西出现这个错误 ### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明标量变量 "@category"。 这是为什么呀,这不是我本身的字段吗?为什么要声明标量?
回复
许晨旭 2015-07-23
merge into T_Mobilie_BackstageCommon a
using (select @category,@positionId) as b(category,positionId) on a.category=b.category and a.positionId=b.positionId
when matched then
	update set   --更新字段
when not matched then
	insert(category, pathStr, jumpToUrl, title, needToLogin, positionId,memo, expansion_one, expansion_two)values
	(category, pathStr, jumpToUrl, title, needToLogin, positionId,memo, expansion_one, expansion_two);
	--插入数据
回复
许晨旭 2015-07-23
用 merge into 的方法 ,存在就更新,不存在就插入http://www.cnblogs.com/qanholas/archive/2012/05/18/2507527.html
回复
bedonga 2015-07-23
说明白点就是判断多个字段同时存在,才更新,有一个不存在就插入!
回复
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-07-23 10:50
社区公告
暂无公告