速成大神小技巧——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高级用法的主要内容,如果未能解决你的问题,请参考以下文章

这些电脑小技巧,你在别人心中的地位会刷的一下提高很多

Navicat for MySQL这个软件,如何批量删除数据,求大神指导.

大神和小白都在用的Pychram小技巧,让你告别低效率工作

Tmux 速成教程:技巧和调整

请PYTHON大神指点?

mysql使用游标遍历数据进行批量针对性更新数据,急求mysql大神解答