有時間我們需要對一張表進行批量數據的更新。首先我們想的是update 語句。
比如對一張訂單表order_info 多條數據更新,
update order_inifo
set order_code =case order_id
when 1 then 'abc'
when 2 then 'bcd'
when 3 then 'cde'
........
end,
order_title=case order_id
when 1 then '標題1'
when 2 then '標題2'
when 3 then '標題3'
..........
end
when id in(1,2,3,..)
這樣實現多條數據 多個字段的更新,這樣更新方式的條件是:
根據表中的字段id在等於不同值時,更新字段 order_code,order_title.
更新成相應的數據,這些數據都是可以明確的。但有時間這些數據是存放在一個集合里面,‘abc’,'bcd','cde','標題1','標題2','標題3',就沒法寫在上面了。這需要
遍歷集合拿到相應的值,才能賦予對應的字段。由於 需要更新的字段 內容和id儲藏在集合中,就沒辦法使用這樣的sql語句了。有沒有別的辦法呢?
我們可以使用replace into方法來實現更新,replace into類似於insert,insert是比較熟悉的,經常使用,就是向數據庫中插入數據。replace into 也是向數據庫中
插入數據,不同的時,在插入數據時,數據庫會根據主鍵或者唯一建(必須保證操作表中含有主鍵或者唯一建)判斷表中是否已經含有對應的數據,如果沒有直接插入,等同於insert,如有表中已經有對應的數據,那replace into就會根據主鍵或唯一建將該條數據delete掉,再做insert處理。
這樣的話,我們完全可以使用replace into批量更新表中的數據。
<update id="upDateOrderInfo" parameterType="String" >
REPLACE INTO order_info (
order_code,
order_company,
order_statu,
order_id,
order_title
)
SELECT
a.order_code,
a.order_company,
a.order_statu,
b.order_id ,
b.order_title
FROM
(
<foreach collection="datas" item="data" separator="union">
SELECT
2 order_statu,
'${data.order_id}' order_id,
'${data.order_code}' order_log,
'${data.order_company}' order_company
</foreach>
) a,
order_info b
WHERE a.order_id = b.order_id
</update>
主鍵order_id和需要更新的字段order_code,order_company。都在集合中。通過replace into可以實現表的批量更新。值得注意的是:
replace into在做update操作時,將原來的數據delete掉了,所有除了更新的字段,其他字段(order_title)需要從原表中查詢出來,一塊更新。
