速成大神小技巧——Mysql批量|DUPLICATE高级用法
Posted 魏小言
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了速成大神小技巧——Mysql批量|DUPLICATE高级用法相关的知识,希望对你有一定的参考价值。
此系列为速成大神系列,掌握这些小技巧,让你在人群中脱颖而出!
数据入库
单条入库
一般初级或简单场景,单条数据入库,SQL如下:
insert into user_info (user_id,user_name,status,years)values (123,'你好’,1,15)
或者
insert into user_info set user_id=123,user_name=“你好”,status=1,years=15;
批量入库
企业级中、大流量业务场景,数据批量写入,SQL如下:
insert into user_info (user_id,user_name,status,years)values (123,‘你好’,1,15),(456,“你好”,2,16);
数据冲突
入库冲突
在某些业务场景中,入库操作一般入库前会去检索下,看数据是否已在表中进行Updata/Insert ,避免数据冲突。
下文交代一种无需检索,直接入库的方法<ON DUPLICATE KEY UPDATE和REPLACE>,也是本文的重点;
如果以user_id 为主键,则:
insert into user_info (user_id,user_name,status,years)values (123,‘你好’,1,15)on duplicate update user_name =values(user_name);
ON DUPLICATE KEY UPDATE:如果插入行出现唯一索引或者主键重复时,则执行旧的update;如果不会导致唯一索引或者主键重复时,就直接添加新行。
REPLACE:如果插入行出现唯一索引或者主键重复时,则delete老记录,而录入新的记录;如果不会导致唯一索引或者主键重复时,就直接添加新行。
Replace & Deplicate异同
1、在没有主键或者唯一索引重复时,replace与insert on deplicate udpate相同。
2、在主键或者唯一索引重复时,replace是delete老记录,而录入新的记录,所以原有的所有记录会被清除,这个时候,如果replace语句的字段不全的话,有些原有的比如c字段的值会被自动填充为默认值。
此时,当user_id冲突时 ,将会保持主键不变,更改user_name,其他数据项操持原数据;
replace into user_info (user_id,user_name,status,years)values (123,'你好',1,15);
此时,(into 可省略)当user_id冲突时 ,将会删除原数据,新加数据项;
Q&A
duplicate update则只执行update标记之后的sql,它保留了所有字段的旧值,只更新update后面的语句;
而replace没有保留旧值,直接删除再insert新值,原有的所有记录会被清除,如果replace语句的字段不全的话,有些原有的比如c字段的值会被自动填充为默认值。
使用的时候结合场景选择。
附录
一天一个小技巧,偷偷超越隔壁小朋友!!
以上是关于速成大神小技巧——Mysql批量|DUPLICATE高级用法的主要内容,如果未能解决你的问题,请参考以下文章