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 key 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字段的值会被自动填充为默认值。
使用的时候结合场景选择。

浙公网安备 33010602011771号