速成大神小技巧——Mysql批量|DUPLICATE高级用法

文章目录

  • 数据入库
    • 单条入库
    • 批量入库
  • 数据冲突
    • 入库冲突
    • Replace & Deplicate异同
    • Q&A
    • 附录

此系列为速成大神系列,掌握这些小技巧,让你在人群中脱颖而出!

数据入库

单条入库

一般初级或简单场景,单条数据入库,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 ,避免数据冲突。

下文交代一种无需检索,直接入库的方法,也是本文的重点;

如果以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,sql,dbase)