背景:replace很好用,的應用場景比較多,但是直接使用可能會造成一引起欄位的值丟失.
解決方法:
一.原始資料
select id,f1,f2 ,flag from update_test;
id f1 f2 flag
1 1 a 1
2 2 b 1
二.更新一條記錄(注意欄位flag的值會丟失)
replace into update_test(id,f1,f2)
select 1 id,'100' f1,'aa' f2
;id f1 f2 flag
1 100 aa (null)
2 2 b 1
注意:replace是先刪除,後插入;如果插入的資料是部分字段(如讀取訂單.csv),那麼其實就造成了資料丟失.
三.避免方法,通過關聯語句先查詢出整行資料:
replace into update_test(id,f1,f2,flag)
select a.id,a.f1,a.f2,b.flag
from (select 2 id,'200' f1,'bb' f2 ) a join (select id,flag from update_test) b on a.id=b.id
;影響行數:2
查詢資料:
select id,f1,f2 ,flag from update_test;
id f1 f2 flag
1 100 aa (丟失)
2 200 bb 1 (儲存了原來的資料)
建議你使用LocalDateTime而不是Date
但是這三步不是原子操作 多執行緒併發如何保證執行緒安全 避免執行緒之間共享乙個 dateformat物件,每個執行緒使用時都建立一次 dateformat物件 建立和銷毀物件的開銷大 對使用format和parse方法的地方進行加鎖 執行緒阻塞性能差 使用threadlocal保證每個執行緒最多隻建...
對電阻使用的經驗法則說不
按照許多年前老師的教導,我們會在運算放大器的兩個輸入端放上相等的阻抗。本文 為什麼會有這麼一條經驗法則,以及我們是否應當遵循這種做法。如果您是在741運算放大器1橫行天下的時代長大的,那麼平衡運算放大器輸入端電阻的觀念必定已扎根在您的頭腦中。隨著時間的流逝,由於不同電路技術和不同ic工藝的出現,這樣...
如何在DataGrid裡面產生滾動條而不滾動題頭
作者blog base.onprerender e resourcemanager manager new resourcemanager this.gettype resourceset resources manager.getresourceset system.globalization.c...