一條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值就更新。
在使用時要確保數據是唯一的,通過主鍵或者唯一索引來指定。如果數據不是唯一的情況,那麼只會更新其中的一條數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章