一.背景
最近在做一個(gè)項(xiàng)目的重構(gòu)工作匕荸,其中涉及到了一部分?jǐn)?shù)據(jù)的清洗和同步工作隆夯。在特定的情況下會(huì)用到一些特殊的mysql 操作旭寿。
二.用法技巧
1.mysql ON DUPLICATE KEY UPDATE
如果你指定了ON DUPLICATE KEY UPDATE眠冈,如果在一個(gè)UNIQUE索引或PRIMARY KEY中出現(xiàn)重復(fù)值往扔,就會(huì)執(zhí)行update之后的操作旋膳,否則執(zhí)行insert操作澎语。
insert into table_name (name, age)values ('xxx', 19);
如果 name為唯一索引且name為'xxx'的記錄已經(jīng)存在,則會(huì)報(bào)錯(cuò).
此時(shí)為了解決這個(gè)問(wèn)題有三種方案验懊。
(1)忽略
insert ignore into table_name (name, age)values ('xxx', 19);
這條sql會(huì)被忽略掉擅羞。
(2)完全覆蓋
replace ignore into table_name (name, age)values ('xxx',19);
這條語(yǔ)句就相當(dāng)于先把原來(lái)表中的記錄刪除掉,然后在重新插入义图。建議在清洗數(shù)據(jù)的時(shí)候使用减俏,因?yàn)榕軘?shù)據(jù)可能由于某些不可抗拒的因素中斷,此時(shí)你就需要接上斷點(diǎn)碱工,可能會(huì)有重合娃承,避免報(bào)錯(cuò)的同時(shí)又保證了數(shù)據(jù)的可靠性。(具體業(yè)務(wù)具體分析)
(3)更新部分字段
insert into table_name (name, age)values ('xxx', 18) on duplicate key update age = 19.
此條語(yǔ)句只更新了age字段怕篷。
2.也可以使用ON DUPLICATE KEY UPDATE實(shí)現(xiàn)批量更新
INSERT INTO table_name (name, age) VALUES?
<foreach collection="list" item="persion" index="index" separator=",">
? ?(#{name}, #{age}1??},
</foreach>
ON DUPLICATE KEY UPDATE?
age = VALUES(age) //此處的age為1??處的age
相對(duì)于case when 會(huì)更加簡(jiǎn)介历筝。
3.msql if語(yǔ)句的使用
mysql的if既可以作為表達(dá)式用,也可在存儲(chǔ)過(guò)程中作為流程控制語(yǔ)句使用廊谓。
(1)IF(expr1,expr2,expr3)
select if(sva=1,"男","女")as ssva from table_name? where id ='111'
(2)也可以與count連著用
select count(if(if(age>18,true,null))) from table_name;
得出age>18的數(shù)量梳猪。