一条sql语句解决插入和更新的问题

关于新增和更新操作,其实是很简单的事情了,在总结这篇文章之前,我的写法就是在程序当中进行判断,然后使用if…else…语句来判定执行更新语句还是新增语句,形式如下:

Domain domain = IDomainService.queryByxxx(xx);
if(domain == null){
IDomainService.insertxxx();
}else{
IDomainService.updatexxx();
}

但这种写法存在一定的问题,在并发比较高的情况下,如果线程走插入逻辑还未走完被挂起,那么后续的线程极有可能再次进入插入逻辑,造成同一条数据被插入两次的情况,虽然可以通过数据库中设置唯一索引来解决,但是这种做法不够优雅简洁,需要操作的步骤太多了。可以使用如下的sql语句来一步完成。形式如下:

<insert id="insertOrUpdateDemo" parameterType="list" >
        insert into table_as_demo (
        demo_date,
        demo_c1,
        demo_c2,
        demo_c3
        )
        values
        <foreach  collection="list" item="item" separator=",">
            (
            #{item.demoDate},
            #{item.demoC1},
           #{item.demoC2},
            #{item.demoC3}
            )
        </foreach>
        ON DUPLICATE KEY UPDATE
        demo_date = VALUES(demo_date),
        demo_c1 = VALUES(demo_c1),
        demo_c2 = VALUES(demo_c2),
        demo_c3 = VALUES(demo_c3)
</insert>

以上例句是在多条数据进行插入或者更新的情况下使用的,如果是单条数据的情况,把foreach去掉,形式稍作更改即可,不再给出范例了。
上面的demo中给出了一个不常见的关键字 ON DULICATE KEY UPDATE,其实完整的语句是INSERT ... ON DUPLICATE KEY UPDATE,意思就是插入数据,如果存在重复的key值就更新。
在使用时要确保数据是唯一的,通过主键或者唯一索引来指定。如果数据不是唯一的情况,那么只会更新其中的一条数据。

猜你喜欢

转载自blog.csdn.net/u013243938/article/details/104875862